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 导入了一个方法。

ma​​in.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 将其安装为通常的包。 有用的链接:

https://packaging.python.org/ https://python-packaging.readthedocs.io/en/latest/index.html https://docs.python.org/3/distutils/setupscript.html https://python-poetry.org/

【讨论】:

【参考方案2】:

main.py的头上试试这个:

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

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

【讨论】:

我在sys.path.append 中看到了该解决方案,但起初我已将其添加到do_something.py...当我将其添加到main.py 时它可以工作。

以上是关于Git子模块的本地导入错误 - Python的主要内容,如果未能解决你的问题,请参考以下文章

如何从 aws lambda 中的 git 子模块导入代码?

使用 git 子模块时如何处理绝对导入

Git子模块添加:“在本地找到一个git目录”问题

手把手教你把 Git 子模块更新到主项目

# git submodule

导入pyspark ETL模块并使用python子进程作为子进程运行时出错