在一个Python项目中使用一个库的两个版本

时间:2015-11-05 20:57:48

标签: python python-2.7

我需要帮助解决下一个问题。有一个项目,需要两个版本的一个库。让这个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?

1 个答案:

答案 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为您提供了许多工具,可以轻松实现进程间通信。