Git子模块的本地导入错误- Python

1cosmwyk  于 2023-08-01  发布在  Git
关注(0)|答案(3)|浏览(143)

我正在做一个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*,他们也必须手动修复导入。
任何帮助都欢迎。

6psbrbz9

6psbrbz91#

main.py的头部尝试以下操作:

import sys
sys.path.append("ProjectB")

#### your old code ###
....

字符串

wqnecbli

wqnecbli2#

Git只是一个版本控制系统。不幸的是,你不能正确地处理这个问题。可能的解决方案是通过添加 ProjectB 目录来修补sys.path变量,但这是黑客。最好的方法是使用Python打包系统,将ProjectB打包到一个pip包中,然后通过pip将其作为一个普通的包安装。有用链接:

b09cbbtk

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的开发人员提出问题,他们可能会为您添加此内容。
希望这对你有帮助。

相关问题