首页 文章

从另一个repo导入python模块

提问于
浏览
0

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

NOT WORKING ATTEMPT #1: 我最初尝试使用git的子模块功能将ModuleRepo包含在AnotherRepo下 . 但是我实际上并不想要ModuleRepo的根文件夹,我只想要子文件夹'MyModule' . 结果是git 's submodule doesn' t这样做 - 一个人不能选择只包括一个回购的一部分 .

UNDESIRABLE SYMLINK: 虽然符号链接可能有用,但它不是一个可以'commit'到存储库的东西,所以有点不受欢迎 . 另外我在Windows和Linux上都在开发,所以我需要一个兼容两者的解决方案 .

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

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

1 回答

  • 2

    几种可能性 .

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

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

    缺点是您需要在 using_my_module.py 中的代码的测试单元中重复此调整 .

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

    • 如果"MyModule"模块没有变化和/或您可以将"MyModule"中发生的开发手动定期合并到您的"main"代码库中,您可以通过使用 git subtree splitgit subtree add 命令来使用所谓的"vendoring"(或者所谓的"subtree merging"而不是后者 .

    基本上, git subtree split 命令允许您从主机"MyModule"中提取出一个合成历史图表,其中只包含在您的情况下触摸指定前缀下的文件的提交 - "MyModule", git subtree add 允许您"subtree-merge"指定前缀的子图在另一个存储库中

相关问题