从另一个repo导入python模块

时间:2017-12-13 01:16:59

标签: python git repository project 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

现在工作得很好。如果我运行测试,他们可以导入模块。该模块能够通过预先挂起的'。'导入自己的文件(例如: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的一部分来包含。

难以理解的SYMLINK:虽然符号链接可能有效,但它不能“提交”到存储库,因此有些不受欢迎。另外我在Windows和Linux上都在开发,所以我需要一个适用于它们的解决方案。

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

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

1 个答案:

答案 0 :(得分:2)

几种可能性。

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

    好处是,这种方法适用于您可以使用的任何解决方案 使用将这两个存储库放在一起 - 就是这样 子模块或子树合并。

    缺点是你需要重复这个调整 using_my_module.py中代码的测试单元。

  • 使用virtualenv 发展。

    为项目设置开发环境的一部分 将安装&#34; MyModule&#34; &#34;常规方式&#34;。

  • 如果&#34; MyModule&#34;模块没有变化和/或你没事 手册定期纳入正在发生的事态发展 在&#34; MyModule&#34;进入你的&#34;主要&#34;代码库,您可以使用所谓的&#34; vendoring&#34;通过使用git subtree splitgit subtree add命令(或所谓的&#34;子树合并&#34;相反 后者)。

    基本上,git subtree split命令允许您 提取出回购托管&#34; MyModule&#34; 合成历史图表,仅包含触摸的提交 指定前缀下的文件 - &#34; MyModule&#34;,在您的情况下, 并且git subtree add允许您&#34;子树合并&#34;那个子图 在另一个存储库中的指定前缀。