python - Git 子模块在 python 项目中使用后会引发导入错误

标签 python python-import git-submodules importerror

我在 python 项目中使用 git-submodule。

子模块项目如下所示:

-submodule_project
    - __init__.py
    - debug_util.py
    - parsing_util
        - __init__.py
        - parse.py
        - consts.py

parse.py 导入 debug_util.py。 这种结构工作正常,因为子模块是一个独立的项目。

我的项目是这样构建的:

-project
    - __init__.py
    - file1.py
    - some_dir
        - __init__.py
        - main.py

因此,一旦我在项目中使用该子模块作为 git 子模块,parse.py 就会引发 ImportError。一旦运行导入 debug_util.py 的行,就会发生这种情况。 只是为了澄清: main.py 导入 parse.py,它导入 debug_util.py

您能否解释一下我做错了什么,以及解决此问题的可用解决方案是什么?

这是我的 .gitmodules 文件:

[submodule "submodule_project"]
path = submodule_project
url = ../submodule_project.git

提前感谢大家!

最佳答案

Git Submodules与他们一起工作非常烦人(至少我上次和他们一起玩时是这样)。我建议不要使用子模块,而只使用 python 自己的依赖管理。因此,您的 submodule_project 将拥有自己的唯一名称,并打包在 myparser-1.2.1 等版本中,然后您的主项目将依赖于其 中的该包>setup.py.

git 子模块的问题(来自 git 文档):

  • 当您克隆[包含子模块的项目]时,默认情况下您会获得包含子模块的目录,但其中还没有任何文件
  • 您必须运行两个命令:git submodule init 来初始化本地配置文件,以及 git submodule update 来从该项目中获取所有数据并检查相应的数据。提交在您的 super 项目中列出
  • 如果您创建一个新分支,在其中添加一个子模块,然后切换回没有该子模块的分支,则子模块目录仍然是未跟踪的目录
  • 删除该目录并不困难,但将其放在那里可能会有点困惑。如果您确实删除了它,然后切换回具有该子模块的分支,则需要运行 submodule update --init 来重新填充它。
  • 如果您正在使用子模块,那么您这样做很可能是因为您确实希望在处理主项目(或跨项目)中的代码的同时处理子模块中的代码。几个子模块)。否则,您可能会使用更简单的依赖管理系统(例如 Maven 或 Rubygems)。

git 子模块的问题(我自己的观察):

  • 您经常会发现子模块处于奇怪的状态:
    • 您想将子模块固定在特定的 git 提交上,但现在它以某种方式发生了漂移,并且您的顶级项目表示存在涉及您的子模块的更改。
    • 不知何故,文件在子模块目录内不断变化,并且 git 提示顶层或子模块中的未暂存更改。
    • 您想要一个子模块来跟踪 master,但它无法正常工作,而且现在您已经获得了非上游的合并提交。
  • 更新初始化一层深的子模块已经够烦人的了,但是如果您的子模块之一也使用子模块怎么办?
  • 许多第三方工具不能很好地与子模块配合使用。我发现很多第三方工具(比如一些 IDE 或 git 的 Web 界面)并没有真正很好地处理 git 的核心部分(处理暂存区、合并、 rebase 、压缩、编写格式良好的提交)消息等),但它们的功能尤其糟糕,即使是最有经验的 git 用户也很少使用。

您也没有提及如何以及在何处从顶级项目设置子模块。如果您从顶级项目粘贴 .gitmodules 文件可能会更有帮助。

关于python - Git 子模块在 python 项目中使用后会引发导入错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45305101/

相关文章:

python - 相当于 Unix "shell function"的 Powershell 脚本

python - 是否可以使用 SRUN 而不是 SBATCH 在后台运行 SLURM 作业?

python - Cython pyd文件不通过python导入

git - 如何从 git repo 添加特定文件夹作为 git 子模块?

git - Jenkins :更新子模块时,使用子模块的最新提交重建主存储库

python - 如何剖析 Python 数据库代码

python - if 语句基于 jsonlines 文件中存在的值

python - 在 Python 中导入按顺序命名的多个文件

python - 如何检查Python中的导入别名冲突?

Git:我可以禁止在状态、差异等中列出 'modified content'/脏子模块条目吗?