2015-05-23 34 views
3

最近我一直在深入挖掘python的核心。目前我正在研究pythons模塊系統以及如何存儲「全局」,「本地」和「非本地」變量。更具體地說,我的問題是解釋器如何處理正在運行的文件?它在模塊(或類似的東西)中被視爲它自己的模塊嗎?python解釋器如何處理基本的.py文件?

+2

作爲一個側面說明,如果你還沒有升級到Python 3.4,這將是一個非常好的時間。導入系統,'run_module'系統,啓動和關閉等等都是一團糟。 2.7,3.2和3.3在改進方面做了幾個步驟; 3.4進行了一次大規模的大修,目的是使整個事件在純Python中實現,沒有未公開的祕密(因此也可以從Python內部鉤取),除了啓動/關閉部分(僅在3.4部分完成)之外。 – abarnert

回答

3

頂層腳本被視爲模塊,但有一些差異。

  • 而不是它的名稱爲腳本的名稱減去.py延伸,它的名字是__main__
  • 頂層腳本不會在.pyc緩存中查找,也不會在那裏編譯和緩存。

除此之外,它主要是相同的:翻譯編譯腳本作爲模塊,構建了types.ModuleType出來,並將其存儲在sys.modules['__main__']

也期待在runpy,它解釋瞭如何python spam.pypython-m spam工作。 (至於,我認爲,3.4,runpy.run_path應該做正好與運行腳本一樣,不只是非常相似的東西。)並注意到文檔鏈接到the source,所以如果你需要查找任何細節的內部,你可以。


第一個區別就是爲什麼你經常會看到這樣的成語:

if __name__ == '__main__': 
    import sys 
    main(sys.argv) # or test() or similar 

這使得同一個文件spam.py用作一個模塊(在這種情況下,其__name__spam)或作爲腳本(在這種情況下,其__name__將爲__main__),代碼只能在腳本案例中運行。


如果您很好奇交互式解釋器的標準輸入是否與腳本處理方式相同,那麼這裏有更多的差異。最重要的是,每條語句都以exec的語句進行編譯和運行,而不是將整個腳本/模塊編譯並作爲模塊運行。

0

,這基本上會發生什麼。這是__main__模塊。您可以通過運行像看到以下內容:

x = 3 
import __main__ 
print(__main__.x) 

無論是運行一個腳本文件,或解釋,這將打印:

3