我有一个很奇怪的场景和目标。我需要进行完全相同的测试,而无需对可能从两个不同程序包导入的库进行任何更改。
[有一个带有大型python程序包big_sdk
的GIT存储库,里面有一个小的库big_sdk.small_lib
。
我将small_lib
库提取到单独的GIT存储库和单独的包small_package.small_lib
中。
该代码将在两个地方都存在一段时间,所以我希望代码在两个地方都完全相同。 (这样可以大大简化GIT工作流程,而不会合并任何历史记录。)
small_lib库本身没有问题-它仅在内部使用相对导入,因此完全相同的代码可以在不同的程序包和存储库中运行和工作。
问题出在测试上。测试位于big_sdk/tests/small_lib_tests
中,并使用绝对导入:
from big_sdk import small_lib
from big_sdk.small_lib import some_module
from big_sdk.small_lib import some_func
将测试代码提取到小型仓库中时,必须将其更改为
from small_package import small_lib
from small_package.small_lib import some_module
from small_package.small_lib import some_func
由于中断了GIT历史,因此出现问题。
我想找到其他方法。
要求:
big_sdk/tests/small_lib_tests/
和small_package/tests/
目录中的所有代码完全相同。 (尽管这些目录之外可能还有其他文件)。big_sdk/*
中的代码不应提及small_package
。这排除了具有多个导入源的简单try/except
方法。我已经尝试将测试切换为从单独的模块small_library.py
导入,该模块将一个仓库中的big_sdk.small_lib
导入另一个仓库中的small_package.small_lib
。它不适用于from big_sdk.small_lib import some_module
等较深的导入。然后,我尝试使用修改了sys.modules['component_library'] = big_sdk.small_lib
的黑客程序,该程序虽然可以部分工作,但需要“注册”所有子模块(sys.modules['component_library.*']
),这并不容易,而且太hacky。
我想我只将small_lib
目录和small_lib_tests
目录作为同级。
之前:
big_sdk/small_lib/*
tests/small_lib_tests/*
之后:
big_sdk/small_lib/*
big_sdk/small_lib_tests/*
这看起来有些丑陋,但是它允许从测试代码中进行相对导入。
from .. import small_lib
from ..small_lib import some_module
from ..small_lib import some_func
这样就不会在代码中提及big_sdk
和small_package
。