2024-05-19 01:17:24 发布
网友
最近我一直在尝试深入研究python的核心。目前我正在研究pythons模块系统,以及如何存储“全局”、“局部”和“非局部”变量。更具体地说,我的问题是解释器如何处理正在运行的文件?它是否被视为模块中自己的模块(或类似的模块)?你知道吗
顶层脚本被视为一个模块,但有一些区别。你知道吗
.py
.pyc
除此之外,基本上是一样的:解释器将您的脚本编译为一个模块,从中构建一个types.ModuleType,存储在sys.modules['__main__'],等等
types.ModuleType
sys.modules['__main__']
另外看看^{},它解释了python spam.py和python-m spam是如何工作的。(我认为,在3.4中,runpy.run_path应该做与运行脚本完全相同的事情,而不仅仅是非常相似的事情。)注意,docs链接到the source,因此如果您需要查找任何内部细节,您可以。你知道吗
python spam.py
python-m spam
runpy.run_path
第一个区别是为什么你经常看到这个成语:
if __name__ == '__main__': import sys main(sys.argv) # or test() or similar
这允许将同一个文件spam.py用作模块(在这种情况下,它的__name__将是spam)或脚本(在这种情况下,它的__name__将是__main__),代码只希望在脚本情况下运行。你知道吗
spam.py
__name__
spam
__main__
如果您想知道交互式解释器的标准输入是否与脚本的处理方式相同,那么还有很多不同之处。最重要的是,每个语句都作为一个带有exec的语句编译和运行,而不是整个脚本/模块作为一个模块编译和运行。你知道吗
exec
是的,基本上就是这样。它是^{}模块。您可以通过运行类似于以下内容的操作来看到这一点:
x = 3 import __main__ print(__main__.x)
无论是作为脚本文件运行,还是在解释器上运行,都将打印:
3
顶层脚本被视为一个模块,但有一些区别。你知道吗
.py
扩展名,而是^{.pyc
缓存中查找,也不会在那里编译和缓存。你知道吗除此之外,基本上是一样的:解释器将您的脚本编译为一个模块,从中构建一个
types.ModuleType
,存储在sys.modules['__main__']
,等等另外看看^{} ,它解释了
python spam.py
和python-m spam
是如何工作的。(我认为,在3.4中,runpy.run_path
应该做与运行脚本完全相同的事情,而不仅仅是非常相似的事情。)注意,docs链接到the source,因此如果您需要查找任何内部细节,您可以。你知道吗第一个区别是为什么你经常看到这个成语:
这允许将同一个文件
spam.py
用作模块(在这种情况下,它的__name__
将是spam
)或脚本(在这种情况下,它的__name__
将是__main__
),代码只希望在脚本情况下运行。你知道吗如果您想知道交互式解释器的标准输入是否与脚本的处理方式相同,那么还有很多不同之处。最重要的是,每个语句都作为一个带有
exec
的语句编译和运行,而不是整个脚本/模块作为一个模块编译和运行。你知道吗是的,基本上就是这样。它是^{} 模块。您可以通过运行类似于以下内容的操作来看到这一点:
无论是作为脚本文件运行,还是在解释器上运行,都将打印:
相关问题 更多 >
编程相关推荐