来自导入系统的 Python 文档(粗体强调是我的):
5.8. 特别考虑
__main__
该
__main__
模块是相对于 Python 导入系统的特例。正如其他地方所指出的,该__main__
模块在解释器启动时直接初始化,非常类似于sys
和builtins
。然而,与这两个不同的是,它严格来说并不符合内置模块的资格。这是因为初始化的方式__main__
取决于调用解释器的标志和其他选项。5.8.1.
__main__.__spec__
根据
__main__
初始化方式,__main__.__spec__
适当设置或设置为None
。当Python使用该
-m
选项启动时,__spec__
被设置为相应模块或包的模块规范。当模块作为执行目录、zip 文件或其他条目的一部分加载__spec__
时也会填充。__main__
sys.path
在其余情况下
__main__.__spec__
设置为None
,因为用于填充 的代码__main__
不直接与可导入模块对应:
互动提示
-c
选项从标准输入运行
直接从源文件或字节码文件运行
请注意,这
__main__.__spec__
始终是None
最后一种情况,即使该文件在技术上可以直接作为模块导入。-m
如果需要有效的模块元数据,请使用该开关__main__
。另请注意,即使
__main__
与可导入模块相对应并__main__.__spec__
进行相应设置,它们仍然被视为不同的模块。这是因为受if __name__ == "__main__":
检查保护的块仅在模块用于填充__main__
命名空间时执行,而不是在正常导入期间执行。
作为脚本运行时,为什么源/字节代码文件不作为模块导入?
一只萌萌小番薯
相关分类