在虚拟环境中使用具有不同版本的相同库

时间:2015-10-19 07:13:51

标签: python virtualenv

我正在使用python中的一个项目,该项目具有多个模块中的依赖项。

例如,我的主要模块使用另外2个模块,即 module_1 ,需要库 lib_version_1.5 module_2 使用相同的 library_but_version_1.8

module_1和module_2都运行正常,现在我正在创建另外一个组合这两个模块的模块。

那么我如何使用虚拟环境以便将这两者与所有必需的库(不同版本)结合起来呢?是否可以在具有不同子模块的项目中安装相同库的不同版本?

1 个答案:

答案 0 :(得分:2)

请注意,python namingspace非常强大。希望这个小例能对你有帮助。

基本理论是将具有不同版本的相同库添加到python的类路径中,并使它们成为不同的名称,以便不会覆盖。

import os, sys
sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), 'libs'))

上面的代码将在' libs'目录下插入第三部分的libs。在您项目的基本目录下。

假设我需要使用版本2.4.1和2.6.1的pycrypto,使用pip install pycrypto==2.6.1 -t ./libsip install pycrypto==2.4.1 -t ./libs将两个版本安装到项目下的子目录中。安装后修改名称,否则将覆盖现有名称。

将它们的名称分别修改为Crypto241和Crypto261。 What my project looks like

我们假设我将有两个模块(ModuleWIthCrypto241ModuleWithCrypto261),它们将分别导入pycrypto 2.4.1和2.6.1。

ModuleWithCrypto261,代码为:

def getCryproVersion(baseDir):
    import os, sys
    sys.path.insert(0, os.path.join(baseDir, 'libs'))
    import Crypto261
    return Crypto261.__version__

ModuleWIthCrypto241,代码为:

def getCryproVersion(baseDir):
    import os, sys
    sys.path.insert(0, os.path.join(baseDir, 'libs'))
    import Crypto241
    return Crypto241.__version__

几乎相同,只需导入不同版本的pycrypto。

然后我们有另一个脚本试图获得两个不同版本的pycrypto。modulewithdiffversion.py

它看起来像什么:

import os, sys

from com.x import ModuleWIthCrypto241
from com.x import ModuleWithCrypto261
if __name__ == '__main__':
    baseDir = os.path.dirname(os.path.abspath(__file__))
    print ModuleWIthCrypto241.getCryproVersion(baseDir)
    print ModuleWithCrypto261.getCryproVersion(baseDir)

执行main方法,它会打印出两个版本的pycrypto:

2.4.1
2.6.1

希望这会对你有帮助!