为什么将 __main__ 名称列为禁止相对导入的原因?

Why is __main__ name presented as a reason for forbidding relative imports?

希望它不是重复的。

https://docs.python.org/3/tutorial/modules.html

Note that relative imports are based on the name of the current module. Since the name of the main module is always "__main__", modules intended for use as the main module of a Python application must always use absolute imports.

我知道我只能使用导入包中的相对导入;

但这里他们似乎提出名称 __main__ 作为主模块必须使用绝对导入的原因。

我的意思是,我也可以在一个目录中有 3 个模块(first.py、第二个和第三个),第一个可以导入第二个和第二个,同时有 __name__ == second(不是__main__) 仍然无法使用相对导入来导入第三个。

那么,他们提供的原因是否符合逻辑?或者它只是规范中的一个缺陷?..

它已经过时了。该文本早于 PEP 366,它在 __main__ 模块中启用相对导入支持。

该文本自 Python 2.5 以来一直以接近当前形式出现在教程中。 PEP 366 进入 Python 2.6,但没有人意识到教程部分已过时。


请注意,如果 Python 认为模块是包的一部分,则 __main__ 模块只能使用相对导入。这通常意味着你必须 运行 它与 python -m。 运行 文件路径的文件将导致 Python 将其视为 top-level 模块而不是包子模块。

例如,如果我有一个目录 blah,其中包含文件 __init__.pyfoo.pybar.py,并且 foo.py 包含

from . import bar

和我 运行 python foo.py 来自 blah 目录,或 python blah/foo.py 来自 blah 目录,那么 foo.py 是不被视为包的一部分,相对导入将失败。

另一方面,如果 blah 作为一个包可以找到(因为我已经安装了它,或者因为我正在 运行ning Python 从上面的目录blah 目录),我做python -m blah.foo 告诉Python 把运行 的blah.foo 模块作为主模块,那么blah.foo 就会被考虑blah 包的一部分,相对导入将成功。