无法 运行 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。
我创建了一个用于大脑预处理的 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。