python - ImportError : 在没有已知父包的情况下尝试相对导入
问题描述
我正在学习使用 python 编程,但从包中的模块导入时遇到问题。我正在使用带有 Python 3.8.2 64 位的 Visual Studio 代码。
.vscode
├── ecommerce
│ ├── __init__.py
│ ├── database.py
│ ├── products.py
│ └── payments
│ ├── __init__.py
│ ├── authorizenet.py
│ └── paypal.py
├── __init__.py
└── main.py
在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 文档和实验看来,相对导入(涉及 .、.. 等)仅在以下情况下才有效
- 导入模块有一个
__name__
以外的__main__
,而且, - 导入模块的
__name__
名称是 pkg.module_name,也就是说,它必须从目录层次结构中的上方导入(要有一个父 pkg 作为它的一部分__name__
。)
或者
导入模块是通过包含父 pkg as 的模块语法指定的python -m pkg.module
,在这种情况下它__name__
仍然是__main__
,因此它作为脚本运行,但相对导入将起作用。这里__package__
设置并用于查找父包 while __name__
is __main__
; 更多在这里。
[毕竟,这似乎是确定相对进口是否/如何起作用的关键__package__
。表示脚本或模块(即,或)。指示相对导入发生在包中的哪个位置,并且顶部需要在.]sys.path
__name__
__main__
module_name
__package__
__package__
sys.path
因此,继续 @AmitTendulkar 的示例,如果您作为> python main.py
或从项目根目录运行它,> python -m main
或者> python -m ecommerce.products
从该根目录输入交互式 python 和import main
,或者import ecommerce.products
products.py 中的相对导入将起作用。
但是,如果您> python products.py
或> python -m products
从电子商务目录中,或从该电子商务目录输入交互式 python,import products
它们将失败。
添加是有帮助的
print("In module products __package__, __name__ ==", __package__, __name__)
等在每个文件中进行调试。
更新:
进口如何运作取决于sys.path
和__package__
,而不是__name__
。从/home/jj
,> python sub/mod.py
发出sys.path
, __package__
of /home/jj/sub
, - 工作None
中的模块的绝对导入sys.path
,相对导入失败。
> python -m sub.mod
有 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__)
等在每个文件中进行调试。
推荐阅读
- java - 单击按钮时框架未关闭
- css - 在服务器上部署时使用 Bootstrap v4.5.0 版本时 Glyphicon-ok 显示错误符号
- django - Django自动注销,登录后它保持在同一页面上
- javascript - 从 React 中的单词数组中搜索引擎
- c# - 如何使用 Razor MVC 从此多选下拉列表中获取价值?
- python - 将相同的数据框行转换为汇总版本
- javascript - window.location.href 在 form-html 中不起作用
- java - Selenium WebDriver com Java 上的单击事件中的 java.lang.NullPointerException
- discord.js - 我将如何在 discord.js 中执行执行 bot 命令?
- r - 从模型 MuMIn::dredge 中提取指数系数