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

问题描述 投票:0回答:2

我在我的 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

提前感谢大家!

python python-import git-submodules importerror
2个回答
3
投票

Git 子模块 使用起来非常烦人(至少我上次使用它们时是这样)。我建议不要使用子模块,而只使用 python 自己的依赖管理。因此,您的

submodule_project
将拥有自己独特的名称,并打包在像
myparser-1.2.1
这样的版本中,然后您的主项目将依赖于其
setup.py
中的该包。

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

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

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

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

您也没有提及如何以及在何处从顶级项目设置子模块。如果您从顶级项目粘贴

.gitmodules
文件可能会更有帮助。


0
投票

我会尝试一下(https://github.com/birdflyi/tst_import)。 onlynone提供的解决方案对我来说是可行且有效的~

© www.soinside.com 2019 - 2024. All rights reserved.