最近我一直在深入挖掘python的核心。目前我正在研究pythons模塊系統以及如何存儲「全局」,「本地」和「非本地」變量。更具體地說,我的問題是解釋器如何處理正在運行的文件?它在模塊(或類似的東西)中被視爲它自己的模塊嗎?python解釋器如何處理基本的.py文件?
3
A
回答
3
頂層腳本被視爲模塊,但有一些差異。
- 而不是它的名稱爲腳本的名稱減去
.py
延伸,它的名字是__main__
。 - 頂層腳本不會在
.pyc
緩存中查找,也不會在那裏編譯和緩存。
除此之外,它主要是相同的:翻譯編譯腳本作爲模塊,構建了types.ModuleType
出來,並將其存儲在sys.modules['__main__']
等
也期待在runpy
,它解釋瞭如何python spam.py
和python-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
相關問題
- 1. 循環解釋python腳本(.py)
- 2. python中的基本文件處理
- 3. 在Python解釋器中調用特定文件路徑中的.py腳本
- 4. 如何使基本的Ruby解釋器
- 5. python基本解釋需要
- 6. JavaScript解釋器如何處理null?
- 7. CPython解釋器如何處理OOP
- 8. python解釋器如何處理對象的負引用計數?
- 9. python 3.5 asyncio解釋器如何處理「暫停」的corutines
- 10. 解釋下面的批處理文件
- 11. 批處理腳本解釋
- 12. 如何從python中的.py文件打開python中的.py文件?
- 13. 解釋基本的Python程序
- 14. Python基本錯誤處理
- 15. 如何讓不同的py文件處理不同的路線?
- 16. 基於Web的Python解釋器的解釋
- 17. 請解釋此批處理文件命令來解壓文件
- 18. 運行Python解釋器的Python解釋器:解釋行爲
- 19. 的Python - 多和文本文件處理
- 20. 安裝了Tornado和Python,但Apache仍在處理.py文件
- 21. 如何理解批處理文件?
- 22. 解釋處理DBNull?
- 23. Python - 文本處理
- 24. 對C++頭文件的基本理解
- 25. Python解釋器可以用Python實現,但是哪個解釋器會解釋解釋器本身?
- 26. 如何使用我在解釋器中創建的python文件?
- 27. 如何保證沒有py文件可以從我的自定義python解釋器編譯?
- 28. 基本MIPS解釋
- 29. 如何在新的Python解釋器中運行Python腳本?
- 30. 如何在Bash中的python解釋器中運行python腳本
作爲一個側面說明,如果你還沒有升級到Python 3.4,這將是一個非常好的時間。導入系統,'run_module'系統,啓動和關閉等等都是一團糟。 2.7,3.2和3.3在改進方面做了幾個步驟; 3.4進行了一次大規模的大修,目的是使整個事件在純Python中實現,沒有未公開的祕密(因此也可以從Python內部鉤取),除了啓動/關閉部分(僅在3.4部分完成)之外。 – abarnert