ImportError:尝试在没有已知父包的情况下进行相对导入[重复]

2024-04-29

我正在学习使用 python 编程,并且在从包中的模块导入时遇到问题。我正在使用 Visual Studio 代码和 Python 3.8.2 64 位。

我的项目目录 https://i.stack.imgur.com/ZQZhP.png

.vscode
├── ecommerce
│   ├── __init__.py
│   ├── database.py
│   ├── products.py
│   └── payments
│       ├── __init__.py
│       ├── authorizenet.py
│       └── paypal.py
├── __init__.py
└── main.py

in the ecommerce/products.py我有的文件:

#products.py
from .database import Database
p = Database(3,2)

这样我就可以导入Database类来自ecommerce/database.py文件。但我收到错误

ImportError : Attempted relative import with no known parent package

看来,从Python 文档 https://docs.python.org/3/tutorial/modules.html#packages并进行实验,相对导入(涉及 ., .. 等)仅在以下情况下才有效

  1. 导入模块有一个__name__以外__main__, 并进一步,
  2. 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.productsproducts.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__)

等每个文件中进行调试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ImportError:尝试在没有已知父包的情况下进行相对导入[重复] 的相关文章

随机推荐