来自导入系统的 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__命名空间时执行,而不是在正常导入期间执行。
作为脚本运行时,为什么源/字节代码文件不作为模块导入?
犯罪嫌疑人X
一只萌萌小番薯
随时随地看视频慕课网APP
相关分类