一旦在python项目中使用,Git子模块就会引发导入错误

时间:2017-07-25 13:40:06

标签: 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

先谢谢大家!

1 个答案:

答案 0 :(得分:2)

Git Submodules非常讨厌(至少他们是我上次和他们一起玩的时候)。我建议不要使用子模块,只需使用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,但它无法正常运行,现在您已经进行了非上游的合并提交。
  • 对于updateinit一个级别的深层子模块来说,这很烦人,但是如果你的一个子模块也使用了子模块呢?
  • 许多第三方工具与子模块不兼容。我发现很多第三方工具(比如某些IDE或git的web界面)并没有真正对待git的核心部分(处理暂存区域,合并,重新绑定,压缩,编写格式良好的提交)消息,等等,但即使是最有经验的git用户也很少使用它们,但它们的功能特别糟糕。

您也没有提到从顶级项目设置子模块的方式和位置。如果您粘贴顶级项目中的.gitmodules文件,则可能会更有帮助。