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的一些功能。所以我尝试了

  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