我有同一个 Python 包的两个版本。我需要从当前版本的子包中的模块中调用旧版本包中的函数(过去复制了自己)
我现在在哪里:
now/
package/
__init__.py
subpackage/
__init__.py
module.py -> "import package.subpackage.... <HERE>"
subpackage2/
...
...
旧版本:
past/
package/
__init__.py
subpackage/
__init__.py
module.py -> "import package.subpackage; from . import module2; .... def f(x) ..."
module2.py
subpackage2/
...
...
我需要导入<HERE>
“旧”f
并运行它。
理想情况下
- 该函数
f
应该在旧包中生存,而不需要对包的新版本一无所知 - 新包中的模块应该调用它,让它过上它的生活,得到结果然后完全忘记旧包的存在(所以在让
f
她做她的事情之后调用“import package.subpackage2”应该运行“new”版本) - 这样做不应该非常复杂
基本思想是通过保存我用于某些任务的代码以及输出数据,然后能够运行其中的一部分来提高可重复性。
遗憾的是,我明白这对 Python 3 来说不是一项简单的任务,所以我准备接受某种妥协。我准备接受,例如在运行旧代码后,“新”代码中f(x)
的名称package
将绑定到旧代码。
编辑
我尝试了两种使用importlib
. 这个想法是创建一个对象mod
然后做f = getattr(mod, "f")
,但它不起作用
- 更改
sys.path
为['.../past/package/subpackage']
然后调用importlib.import_module('package.subpackage.module')
. 问题是即使更改了,它也会在“现在”中加载一个sys.path
,可能是因为名称package
已经在sys.modules
spec = importlib.util.spec_from_file_location("module", "path..to..past..module.py")) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module)
在这种情况下,相对导入 (from . import module2.py
) 将不起作用,并给出错误“尝试了没有已知父包的相对导入”