我正在做一个Python项目(* 项目A*),它使用了GitHub上的另一个项目(* 项目B*)。我不是GitMaven,所以在快速研究之后,我发现我应该将 * 项目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
型
- 项目B* 是一个子模块,它假设 * 项目B* 目录是项目的根目录,所以方法from util.py in do_something.py 在没有指定包的情况下导入,我得到了一个错误:
ImportError: cannot import name 'bar' from 'util'
型
相反,它应该像这样导入:
from ProjectB.util import bar
型
我不知道什么是最好的处理方式。我已经手动修复了子模块中的导入,但是我不能将这些更改推送到Git,因为子模块不是这样工作的,所以如果有人想克隆 * 项目A*,他们也必须手动修复导入。
任何帮助都欢迎。
3条答案
按热度按时间6psbrbz91#
在
main.py
的头部尝试以下操作:字符串
wqnecbli2#
Git只是一个版本控制系统。不幸的是,你不能正确地处理这个问题。可能的解决方案是通过添加 ProjectB 目录来修补
sys.path
变量,但这是黑客。最好的方法是使用Python打包系统,将ProjectB打包到一个pip包中,然后通过pip将其作为一个普通的包安装。有用链接:b09cbbtk3#
ProjectB的顶级目录中应该有一个
__init__.py
文件。有一个将意味着它将被识别为一个包,并且ProjectB中的文件可以从ProjectB中导入其他文件。do_something.py
可以通过使用以下命令导入util:from .util import bar
个util
之前的.
被解释为“来自这个包的顶层”,因为在ProjectB目录中有一个__init__.py
文件,Python会知道这是引用的顶层文件夹。这意味着,无论您将ProjectB目录命名为什么,或者将其移动到什么位置,其中的文件都不需要更改它们的import语句。您仍然可以通过执行以下操作从
main
导入foo
from ProjectB.do_something import foo
。如果您可以编辑ProjectB或向ProjectB的开发人员提出问题,他们可能会为您添加此内容。
希望这对你有帮助。