Git子模块的本地导入错误 - Python
Posted
技术标签:
【中文标题】Git子模块的本地导入错误 - Python【英文标题】:Git submodule's local import error - Python 【发布时间】:2021-05-17 00:19:39 【问题描述】:我正在开发一个 Python 项目 (Project A),该项目使用来自 GitHub 的另一个项目 (Project B)。我不是 Git 专家,所以经过快速研究后,我发现我应该使用 Project B 作为git submodule
。
所以,我cd project_A_root
做了以下事情:
git submodule add project_B
git submodule init
git submodule update
现在,我的项目结构如下所示:
在 main.py 文件中,我从 do_something.py 导入了一个方法。
main.py
from ProjectB.do_something import foo
但是,do_something.py 文件从 util.py 文件中导入了一个方法,这就是问题所在。
do_something.py
from util import bar
Project B 是一个子模块,它假定 Project B 目录是项目的根目录,因此 util.py 中的方法do_something.py 是在没有指定包的情况下导入的,我得到一个错误:
ImportError: cannot import name 'bar' from 'util'
相反,它应该像这样导入:
from ProjectB.util import bar
我不确定处理此问题的最佳方法是什么。 我已经手动修复了子模块中的导入,但我无法将这些更改推送到 Git,因为这不是子模块的工作方式,所以如果有人想克隆 Project A,他们也必须手动修复导入。
欢迎任何帮助。
【问题讨论】:
"…我发现我应该将项目 B 用作 git 子模块。" 不,你不应该。您应该使用适当的依赖项/包管理。见***.com/a/54155860/7976758 【参考方案1】:Git 只是一个版本控制系统。不幸的是,您无法正确处理此问题。
可能的解决方案是通过添加 ProjectB 目录来修补 sys.path
变量,但这是 hack。
最好的办法是使用 Python 打包系统,将 ProjectB 打包成一个 pip 包,然后通过 pip 将其安装为通常的包。
有用的链接:
【讨论】:
【参考方案2】:在main.py
的头上试试这个:
import sys
sys.path.append("ProjectB")
#### your old code ###
....
【讨论】:
我在sys.path.append
中看到了该解决方案,但起初我已将其添加到do_something.py
...当我将其添加到main.py
时它可以工作。以上是关于Git子模块的本地导入错误 - Python的主要内容,如果未能解决你的问题,请参考以下文章