为什么将模块从源或字节码文件的路径初始化为不可导入?

问题描述

import system的Python文档中,有以下部分(加粗强调):

5.8。 __main__

的特殊注意事项

__main__模块相对于Python的导入系统是一种特殊情况。如其他地方所述, __main__模块是在解释器启动时直接初始化的, 非常类似于sysbuiltins。但是,与这两个不同的是 严格合格为内置模块。这是因为 __main__的初始化取决于标志和其他选项 解释器被调用

5.8.1。 __main__.__spec__

根据__main__的初始化方式,可以适当地设置__main__.__spec__或将其设置为None

使用-m选项启动Python时,__spec__设置为 相应模块或包装的模块规格。 __spec__也是 在执行__main__模块的过程中加载sys.path模块时填充 目录,zip文件或其他__main__.__spec__条目。

在其他情况下,将None设置为__main__作为代码 用于填充-c的位置不直接与 导入模块:

  • 互动提示
  • __main__.__spec__选项
  • 从标准输入运行
  • 直接从源文件或字节码文件运行

请注意,None在最后总是-m 在这种情况下,即使技术上该文件可以直接作为 。如果需要有效的模块元数据,请使用__main__开关 在__main__中。

还要注意,即使__main__.__spec__对应于可导入对象 模块和if __name__ == "__main__":进行了相应设置,它们仍然 被视为 distinct 模块。这是由于以下事实: 由__main__保护的检查仅在 模块用于填充__spec__名称空间,而不是在 正常导入。

为什么将模块从源或字节码文件的路径初始化为不可导入(None1,1)?

解决方法

如文档中所述,当以脚本python <file path>)运行时,源/字节代码文件不会作为模块导入,因为将代码作为模块运行 已经是 -m 参数 (python -m <module name>) 的用途。