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

Python 跨虚拟环境使用不同版本的相同库,python,virtualenv,Python,Virtualenv,我正在从事一个python项目,该项目在多个模块中具有依赖关系 例如,my主模块使用另外两个模块,即需要库库1.5版的模块1和使用相同库但库1.8版的模块2 模块1和模块2都运行良好,现在我正在创建另一个结合这两个模块的模块 那么,如何使用虚拟环境,以便将这两个库与所有必需的库(不同版本)结合起来呢?是否可以在一个具有不同子模块的项目中安装相同库的不同版本?请注意,python namingspace非常强大。希望这个小例子能对你有所帮助 基本理论是将具有不同版本的相同lib添加到python的

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

例如,my主模块使用另外两个模块,即需要库库1.5版的模块1和使用相同库但库1.8版的模块2

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


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

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

基本理论是将具有不同版本的相同lib添加到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./libs
ip install pycrypto==2.4.1-t./libs
将这两个版本安装到项目下的子目录中。在安装一个后修改它们的名称,否则它将覆盖现有名称

分别将其名称修改为Crypto241和Crypto261。

假设我有两个模块(
ModuleWIthCrypto241
ModuleWithCrypto261
),分别导入PyCrypto2.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__
def getCryproVersion(baseDir):
    import os, sys
    sys.path.insert(0, os.path.join(baseDir, 'libs'))
    import Crypto241
    return Crypto241.__version__
模块使用Crypto241,代码为:

def getCryproVersion(baseDir):
    import os, sys
    sys.path.insert(0, os.path.join(baseDir, 'libs'))
    import Crypto261
    return Crypto261.__version__
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

希望这对你有帮助

仅通过对项目命名;将它们打包到新的顶级目录中,这些目录也是包。这将取决于项目是否为此而构建(例如,使用
from.import name
relative imports)。请注意,在实际项目中尝试这种情况时,请仅尝试sys.path.isnert一次,否则可能会多次将“libs”目录插入系统路径。