为什么将 __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__.py
、foo.py
和 bar.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
包的一部分,相对导入将成功。
希望它不是重复的。
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__.py
、foo.py
和 bar.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
包的一部分,相对导入将成功。