无法 运行 python 独立打包并嵌套在另一个存储库下

Unable to run python package stand-alone and nested under another repoistory

我创建了一个用于大脑预处理的 python 包 - 名为 bpt。我还想在另一个名为 brain_seg 的项目中使用相同的包作为子模块。 结果,我遇到了导入语句的问题,这些语句在 运行 独立或嵌套包时导致错误。

bpt包的结构如下:

bpt
   |--__init__.py
   |--module1.py
   |--module2.py
   |--run.py

文件 run.py 中的导入语句类似于:

import os
import module1
import module2

.
.
.

brain_seg包的结构如下:

brain_seg
   |--bpt
   |     |--__init__.py
   |     |--module1.py
   |     |--module2.py
   |     |--run.py
   |
   |--package2
   |     |--__init__.py
   |     |--module1a.py
   |
   |--__init__.py

当 运行 连接作为独立 bpt 包的一部分的 run.py 脚本时,一切 运行 都符合预期。

如果我尝试 运行 相同的脚本作为 brain_seg 包的一部分,则会出现以下错误:

ModuleNotFoundError: No module named 'module1'

我尝试使用相对导入,因此嵌套项目将按预期工作,生成以下 run.py 文件:

import os
from . import module1
from . import module2

.
.
.

更改后,brain_seg 项目的执行按预期工作,但是当我尝试从独立的 bpt 包调用 run.py 脚本时,结果如下发送错误:

ImportError: attempted relative import with no known parent package

我应该如何处理导入以便支持这两个选项?

bpt.run 中的导入必须是绝对的或相对的:

from bpt.module1 import ... # absolute
from .module1 import ...  # relative

从你的存储库根目录 运行 bpt.run 正确设置你的 pythonpath,使用 -m:

python bpt/run.py  # bad
python -m bpt.run  # good

如果 brain_seg 不是真正意义上的包本身,而只是一个由多个包和模块组成的项目,请删除 brain_seg/__init__.py.

如果你确实打算将它作为一个包使用,那么将它移到 repo 根目录下,即

- README.md (etc.)
- .gitignore (etc.)
- brain_seg
  - __init__.py
  - bps
    - __init__.py
    - main.py

并使用例如python -m brain_seg.bps.run 来自存储库根目录。

如果您还打算将 bps 用作独立的东西,我根本不建议将其保留在 brain_seg 层次结构中,而是使其 pip install 可用(请参阅 https://packaging.python.org/tutorials/packaging-projects/) 然后 pip install -e ../somewhere/bps 让 pip 在您的项目之间设置可编辑的 link。