从另一个仓库导入 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" 该子图
在另一个存储库中的指定前缀处。
我写了一个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" 该子图 在另一个存储库中的指定前缀处。