从另一个 repo 导入 python 模块

qea*_*adz 3 python git project repository git-submodules

我写了一个python模块。它驻留在一个回购。现在要运行模块的单元测试,它们不能是该模块的子文件夹。解决此问题的建议结构是:

ModuleRepo/
  MyModule/
    __init__.py
    some_utils.py
      import .some_helpers
    some_helpers.py
  Tests/
    some_utils_test.py
      import MyModule.some_utils
    some_helpers_test.py
      import MyModule.some_helpers
Run Code Online (Sandbox Code Playgroud)

现在效果很好。如果我运行测试,他们就可以导入模块。该模块能够通过前置 '.' 导入自己的文件(例如:some_helpers)。表示本地文件夹。

问题是一个不同的 repo 现在想要共享这个模块,我不知道如何让它找到该模块。

例如:

ModuleRepo/
  MyModule/
    __init__.py
    ...
  Tests/
    ...
AnotherRepo/
  using_my_module.py
    import ??? <-- how to find MyModule?
Run Code Online (Sandbox Code Playgroud)

不工作的尝试 #1: 我最初尝试使用 git 的子模块功能将 ModuleRepo 包含在 AnotherRepo 下。但是我实际上并不想要ModuleRepo的文件夹,我只想要子文件夹“MyModule”。事实证明 git 的子模块并没有这样做 - 一个人不能只选择要包含的回购的一部分。

不受欢迎的符号链接虽然符号链接可能有效,但它不能“提交”到存储库,因此有些不受欢迎。此外,我正在 Windows 和 Linux 上进行开发,因此我需要一个适用于两者的解决方案。

可能的解决方案:将 ModuleRepo root 也变成一个模块(添加一个init .py)。然后我可以使用 git 使其成为 AnotherRepo 的子模块。我的导入会很丑,但它会是: import my.module.some_utils 而不是 import mymodule.some_utils

有没有人有更好的解决方案?

kos*_*tix 5

几种可能性。

  • 调整sys.path 代码顶层某处的变量,使ModuleRepo目录在那里列出。

    好处是这种方法适用于您可以用来将这两个存储库彼此放在一边的任何解决方案 - 无论是子模块还是子树合并。

    缺点是您还需要在using_my_module.py.

  • virtualenv发展。

    为项目设置开发环境的一部分将是“常规方式”安装“MyModule”。

  • 如果“MyModule”模块没有变化和/或您可以 将“MyModule”中发生的开发手动定期合并到您的“主要”代码库中,您可以通过使用git subtree splitgit subtree add命令(或所谓的“子树合并”而不是后者)。

    基本上,该git subtree split命令允许您从托管“MyModule”的存储库中提取一个合成历史图,该图表仅包含在指定前缀下接触文件的提交——“MyModule”,在您的情况下,并git subtree add允许您“子树合并”另一个存储库中指定前缀的子图。