问题描述
在import system的Python文档中,有以下部分(加粗强调):
5.8。
的特殊注意事项__main__
__main__
模块相对于Python的导入系统是一种特殊情况。如其他地方所述,__main__
模块是在解释器启动时直接初始化的, 非常类似于sys
和builtins
。但是,与这两个不同的是 严格合格为内置模块。这是因为__main__
的初始化取决于标志和其他选项 解释器被调用。5.8.1。
__main__.__spec__
根据
__main__
的初始化方式,可以适当地设置__main__.__spec__
或将其设置为None
。使用
-m
选项启动Python时,__spec__
设置为 相应模块或包装的模块规格。__spec__
也是 在执行__main__
模块的过程中加载sys.path
模块时填充 目录,zip文件或其他__main__.__spec__
条目。在其他情况下,将
None
设置为__main__
作为代码 用于填充-c
的位置不直接与 导入模块:请注意,
None
在最后总是-m
在这种情况下,即使技术上该文件可以直接作为 。如果需要有效的模块元数据,请使用__main__
开关 在__main__
中。还要注意,即使
__main__.__spec__
对应于可导入对象 模块和if __name__ == "__main__":
进行了相应设置,它们仍然 被视为 distinct 模块。这是由于以下事实: 由__main__
保护的检查仅在 模块用于填充__spec__
名称空间,而不是在 正常导入。
为什么将模块从源或字节码文件的路径初始化为不可导入(None
是1,1
)?
解决方法
如文档中所述,当以脚本(python <file path>
)运行时,源/字节代码文件不会作为模块导入,因为将代码作为模块运行 已经是 -m
参数 (python -m <module name>
) 的用途。