跨虚拟环境使用不同版本的相同库

Sre*_*321 7 python virtualenv

我正在开发一个 python 项目,该项目在多个模块中具有依赖关系。

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

module_1 和 module_2 都运行良好,现在我正在创建另一个结合这两个模块的模块。

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

low*_*tty 5

请注意,python 命名空间非常强大。希望这个小例子能对您有所帮助。

基本理论是,将不同版本的相同库添加到Python的类路径中,并使它们具有不同的名称,这样就不会发生覆盖。

import os, sys
sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), 'libs'))
Run Code Online (Sandbox Code Playgroud)

上面的代码将在项目基目录下的“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。 我的项目是什么样的

假设我有两个模块(ModuleWIthCrypto241, ModuleWithCrypto261),它们将分别导入 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__
Run Code Online (Sandbox Code Playgroud)

ModuleWIthCrypto241 代码:

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

几乎一样,只是导入不同版本的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)
Run Code Online (Sandbox Code Playgroud)

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

2.4.1
2.6.1
Run Code Online (Sandbox Code Playgroud)

希望对你有帮助!