最近我一直在努力深入挖掘python的核心。目前我正在研究pythons模块系统以及如何存储“全局”,“本地”和“非本地”变量。更具体地说,我的问题是解释器如何处理正在运行的文件?它在模块(或类似的东西)中被视为自己的模块吗?
答案 0 :(得分:3)
顶级脚本被视为一个模块,但有一些差异。
.py
扩展名,其名称为__main__
。.pyc
缓存中查找,也不会在那里编译和缓存。除此之外,它大致相同:解释器将您的脚本编译为模块,从中构建types.ModuleType
,将其存储在sys.modules['__main__']
等等。
另请参阅runpy
,其中解释了python spam.py
和python-m spam
的工作原理。 (截止到,我认为,3.4,runpy.run_path
应该完全与运行脚本完全相同,而不仅仅是非常类似的东西。)并注意文档链接到{{3}如果你需要查找内部的任何细节,你可以。
第一个区别是你经常看到这个成语的原因:
if __name__ == '__main__':
import sys
main(sys.argv) # or test() or similar
这允许将相同的文件spam.py
用作模块(在这种情况下,其__name__
将为spam
)或作为脚本(在这种情况下为__name__
将是__main__
),代码只能在脚本案例中运行。
如果您对交互式解释器的标准输入是否与脚本的处理方式一致感到好奇,那么会有很多不同之处。最重要的是,每个语句都编译并作为带有exec
的语句运行,而不是整个脚本/模块被编译并作为模块运行。
答案 1 :(得分:0)
是,基本上就是这样。它是__main__
模块。您可以通过运行以下内容来查看此内容:
x = 3
import __main__
print(__main__.x)
要么作为脚本文件运行,要么在解释器上运行,这将打印:
3