从另一个仓库导入 python 模块

importing a python module from another repo

我写了一个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

现在一切正常。如果我 运行 测试,他们能够导入模块。该模块能够通过前置“.”来导入自己的文件(例如:some_helpers)。以指示本地文件夹。

问题是另一个仓库现在想要共享这个模块,我不知道如何让它找到这个模块。

例如:

ModuleRepo/
  MyModule/
    __init__.py
    ...
  Tests/
    ...
AnotherRepo/
  using_my_module.py
    import ??? <-- how to find MyModule?

尝试 #1 无效: 我最初尝试使用 git 的子模块功能将 ModuleRepo 包含在 AnotherRepo 下。但是我实际上并不想要 ModuleRepo 的 root 文件夹,我只想要子文件夹 'MyModule'。事实证明 git 的子模块不会这样做 - 不能只选择要包含的 repo 的一部分。

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

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

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

几种可能性。

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

    好处是这种方法适用于任何你能找到的解决方案 过去常常将这两个存储库放在一起——无论是 子模块或子树合并。

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

  • 中代码的测试单元
  • 使用virtualenv 发展。

    项目开发环境搭建的一部分 将安装 "MyModule" "the regular way".

  • 如果 "MyModule" 模块没有变化 and/or 你可以 手动 定期合并发生的发展 在 "MyModule" 到您的 "main" 代码库中,您可以通过使用 git subtree split 和所谓的 "vendoring" 和 git subtree add 命令(或所谓的 "subtree merging" 后者)。

    基本上,git subtree split 命令允许您 从存储库托管中提取 "MyModule" 合成 历史图仅包含触及的提交 指定前缀下的文件 — "MyModule",在您的例子中, git subtree add 允许您 "subtree-merge" 该子图 在另一个存储库中的指定前缀处。