作为脚本运行时,为什么源/字节代码文件不作为模块导入?

来自导入系统的 Python 文档(粗体强调是我的):

5.8. 特别考虑__main__

__main__模块是相对于 Python 导入系统的特例。正如其他地方所指出的,该__main__模块在解释器启动时直接初始化,非常类似于sysbuiltins。然而,与这两个不同的是,它严格来说并不符合内置模块的资格。这是因为初始化的方式__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
浏览 84回答 1
1回答

一只萌萌小番薯

正如文档中所指定的,当作为脚本( )运行时,源/字节代码文件不会作为模块导入,python <file path>因为将代码作为模块-m运行已经是参数 ( )的目的python -m <module name>。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python