看来,从Python 文档 https://docs.python.org/3/tutorial/modules.html#packages并进行实验,相对导入(涉及 ., .. 等)仅在以下情况下才有效
- 导入模块有一个
__name__
以外__main__
, 并进一步,
- the
__name__
导入模块的名称是 pkg.module_name,即,它必须从目录层次结构的上方导入(以将父 pkg 作为其一部分)__name__
.)
OR
导入模块是通过包含父 pkg 的模块语法指定的python -m pkg.module
,在这种情况下它是__name__
还是__main__
,因此它作为脚本运行,但相对导入将起作用。这里__package__
被设置并用于查找父包,同时__name__
is __main__
; 更多这里 https://www.python.org/dev/peps/pep-0366/#proposed-change.
【毕竟如此看来__package__
and sys.path
是确定相对导入是否/如何发挥作用的关键。__name__
表示脚本或模块(即__main__
or module_name
). __package__
指示相对导入发生在包中的位置,以及顶部__package__
需要在sys.path
.]
因此,继续@AmitTendulkar 的示例,如果您将其运行为> python main.py
or > python -m main
or > python -m ecommerce.products
从项目根目录,或从该根目录输入交互式 python 并import main
, or import ecommerce.products
products.py 中的相对导入将起作用。
但如果你> python products.py
or > python -m products
从电子商务目录中,或从该电子商务目录输入交互式 python 并import products
他们会失败。
添加有帮助
print("In module products __package__, __name__ ==", __package__, __name__)
等每个文件中进行调试。
UPDATE:
进口如何运作取决于sys.path
and __package__
, 不开__name__
。
发出自/home/jj
, > python sub/mod.py
has a sys.path
, __package__
of /home/jj/sub
, None
-模块的绝对导入sys.path
工作,相对导入失败。
> python -m sub.mod
has sys.path
, __package__
of /home/jj
, sub
-模块的绝对导入sys.path
工作,相对进口 工作相对于sys.path
+ __package__
.
补充一下更有帮助
import sys
print("In module products sys.path[0], __package__ ==", sys.path[0], __package__)
等每个文件中进行调试。