我需要帮助解决下一个问题。有一个项目,需要两个版本的一个库。让这个lib为 lib ,其版本为: libold 和 libnew 。这些库不能通过pypi访问,即它们都在自己的文件夹中。让这些文件夹的路径为 / path / to / libold 和 / path / to / libnew 。
在我的项目中,我需要来自这两个库的类的实例,但我不能同时导入它们,而只能导入旧库或新库。
我尝试了下一个方法:
import sys
sys.path.insert(0,'path/to/libold')
import lib as libold
sys.path.pop(0)
sys.path.insert(0,'path/to/libnew')
import lib as libnew
执行此命令后,libold和libnew代表相同的库libold。
我也试过了importlib和imp并得到了相同的结果。
如何执行导入2个版本的lib?
答案 0 :(得分:0)
Python将导入的模块添加到sys.modules
。当您编写import lib as libnew
时,sys.modules['lib']
已经存在,因此不会导入新的库。
要导入新的lib,您应该从sys.modules
中删除旧的lib,如下所示:
import sys
sys.path.insert(0, 'path/to/libold')
import lib as libold
sys.path.pop(0)
del sys.modules['lib']
sys.path.insert(0, 'path/to/libnew')
import lib as libnew
但是,您可能会遇到严重问题。特别是,如果旧的lib尝试导入子模块(例如,lib.submodule
),它将获得新的子模块。因此,在删除sys.modules['lib']
之前和导入新库之前,最好导入旧库的所有子模块。
然而,这是一个肮脏的黑客,而不是一个真正的解决方案。在Python中,模块和包由名称而不是路径标识。这就是它的工作方式,而且一直有效,而且你无能为力。
请考虑使用GIMP来克服这些"限制"。使用multiprocessing
,您可以运行两个进程:一个使用旧的lib,另一个使用新的lib。 multiprocessing
为您提供了许多工具,可以轻松实现进程间通信。