python 包中的相对导入
Relative import in python packages
以下是我的python包结构
PKG
|-->build
|-->dist
|-->src
| |-->pkg
| | |-->data
| | | |-->__init__.py
| | | |-->module1.py
| | |-->dataset
| | | |-->__init__.py
| | | |-->module2.py
| | |-->__init__.py
| |-->pkg.egg-info
| |-->__init__.py
|-->__init__.py
|-->LICENSE
|-->>README.md
|-->setup.py
我想在模块2中使用模块1的一些功能。所以我尝试了
from ..data import module1
给出了 ImportError: attempted relative import with no known parent package
import sys
sys.path.append('../../')
from data import module1
给了
ModuleNotFoundError: No module named 'data'
目前,我不确定如何解决这个问题。
只需尝试使用 sys.path.append("../")
你的问题几乎可以肯定是由于 运行ning module2.py
作为脚本“原始”,而不是作为植根于 pkg
的合格模块名称执行它,例如运行宁python3 path/to/pkg/dataset/module2.py
。问题是它 运行s module2.py
以这样的方式认为自己是一个独立的脚本,它根本不知道它“应该”是 pkg.dataset.module2
。
正确的解决方案是,在安装包(进入系统或用户 site-packages
,或将其安装到活动的虚拟环境中)后,以 知道的方式执行它 其限定名称正确,例如:
python3 -m pkg.dataset.module2
这告诉 Python 通过父包在模块搜索路径中查找导入合格的模块,因此 运行 知道它 在一个包中,因此可以执行相对导入。
- 开发阶段
import sys
sys.path.append('/path/to/src')
from pkg.data import module1
- 部署阶段
移除
import sys
sys.path.append('/path/to/src')
并保持
from pkg.data import module1
以下是我的python包结构
PKG
|-->build
|-->dist
|-->src
| |-->pkg
| | |-->data
| | | |-->__init__.py
| | | |-->module1.py
| | |-->dataset
| | | |-->__init__.py
| | | |-->module2.py
| | |-->__init__.py
| |-->pkg.egg-info
| |-->__init__.py
|-->__init__.py
|-->LICENSE
|-->>README.md
|-->setup.py
我想在模块2中使用模块1的一些功能。所以我尝试了
from ..data import module1
给出了ImportError: attempted relative import with no known parent package
import sys
sys.path.append('../../')
from data import module1
给了
ModuleNotFoundError: No module named 'data'
目前,我不确定如何解决这个问题。
只需尝试使用 sys.path.append("../")
你的问题几乎可以肯定是由于 运行ning module2.py
作为脚本“原始”,而不是作为植根于 pkg
的合格模块名称执行它,例如运行宁python3 path/to/pkg/dataset/module2.py
。问题是它 运行s module2.py
以这样的方式认为自己是一个独立的脚本,它根本不知道它“应该”是 pkg.dataset.module2
。
正确的解决方案是,在安装包(进入系统或用户 site-packages
,或将其安装到活动的虚拟环境中)后,以 知道的方式执行它 其限定名称正确,例如:
python3 -m pkg.dataset.module2
这告诉 Python 通过父包在模块搜索路径中查找导入合格的模块,因此 运行 知道它 在一个包中,因此可以执行相对导入。
- 开发阶段
import sys
sys.path.append('/path/to/src')
from pkg.data import module1
- 部署阶段 移除
import sys
sys.path.append('/path/to/src')
并保持
from pkg.data import module1