从另一个仓库导入Python模块

5

我写了一个 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的根目录,我只想要子文件夹'MyModule'。结果发现git的子模块并不能做到这一点——一个不能只选择一个仓库的一部分来包含。 不理想的符号链接: 虽然符号链接可能起作用,但它不是可以“提交”到存储库的东西,因此有点不理想。此外,我需要在Windows和Linux上进行开发,因此需要一个适用于两者的解决方案。 可能的解决方案: 将ModuleRepo的根目录也变成一个模块(添加一个init.py)。然后,我可以使用git将其作为AnotherRepo的子模块。我的导入会很丑,但它将是:import my.module.some_utils而不是import mymodule.some_utils。
有没有更好的解决方案?

我能看到的最好的方法是创建分离的项目,并通过创建PyPI包将它们用作依赖项。 - manoelhc
1个回答

5

几种可能性。

  • 在代码顶层的某个位置调整sys.path变量,让ModuleRepo目录被列出。

    好处是这种方法可以与任何将这两个存储库放置在一起的解决方案配合使用,无论是子模块还是子树合并。

    缺点是您还需要在using_my_module.py中的测试单元中重复此操作。

  • 使用virtualenv进行开发。

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

  • 如果“MyModule”模块没有变动和/或您可以接受将发生的开发工作手动定期合并到您的“主”代码库中,那么您可以通过使用git subtree splitgit subtree add命令(或后者的所谓的“子树合并”)来进行所谓的“供应商管理”。

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


如果子树分离/添加不起作用,sys.path调整可能是最简单的方法(而且它是提交到repo中的,这也很好)。如果子树分离/添加不起作用,那将是我的备选计划。谢谢。 - qeadz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接