如何让VirtualEnv使用自定义版本的setuptools?

时间:2011-05-11 16:54:19

标签: python virtualenv setuptools distribute

我工作的大公司使用自定义版本的Setuptools。这个私有的setuptools分支旨在解决我们组织特有的某些网络和安全问题。最重要的是,标准的Setuptools和Distribute都不会在我们的环境中按预期工作。

我想开始在系统上使用Ian Bicking优秀的VirtualEnv工具,特别是在我们需要能够为测试代码设置大量沙盒区域的测试系统中 - 例如在我们的持续集成环境中。

不幸的是,每当我尝试构建新的虚拟环境时,virtualenv工具都会尝试获取并安装最新的官方版本的Setuptools。由于上述原因,这将失败,并且还因为公司防火墙会阻止此操作。

而不是安装正式版:

setuptools-0.6c11-py2.4.egg

我想安装我们的定制版本,可能会被称为:

setuptools-foo-0.6c11-py2.4.egg

始终可以保证在系统的全球网站包中找到此蛋。我还可以保证它存在于我们所有的公司鸡蛋服务器中。

你能帮助我让我的virtualenv使用我的自定义setuptools而不是常规版本的setuptools。

3 个答案:

答案 0 :(得分:2)

该名称在virtualenv.py中是硬编码的。您必须修补virtualenv.py或命名修补的setuptools egg'settingtools-0.6c11-py2.4.egg'

答案 1 :(得分:1)

我已经开始编写我自己的导入virtualenv的包装器脚本。主要原因是我使用dpkgs来安装我的大多数依赖项,包括distribute,因此我希望在创建新环境时避免下载额外的副本 - 这样可以让它运行得更快。

这是一个可以用来开始的基线包装器。我添加了一条注释,您可以在其中插入一些代码以将自定义setuptools代码符号链接/复制到virtualenv中:

import os, subprocess, sys, virtualenv

# virtualenv changed its internal api slightly after 1.5. 
NEW_API = (1, 5)

def get_version(version):
    return tuple([int(v) for v in version.split('.')])

def main():
    # set the logging level here
    level = virtualenv.Logger.level_for_integer(0)
    logger = virtualenv.Logger([(level, sys.stdout)])
    virtualenv.logger = logger

    # insert your command-line parsing code here, if needed
    root = sys.argv[1]

    home, lib, inc, bin = virtualenv.path_locations(root)
    result = virtualenv.install_python(home, lib, inc, bin,
            site_packages=True, clear=False)
    pyexec = os.path.abspath(result)
    version = get_version(virtualenv.virtualenv_version)
    if version < NEW_API:
        virtualenv.install_distutils(lib, home)
    else:
        virtualenv.install_distutils(home)
    virtualenv.install_activate(home, bin)

    # insert whatever post-virtualenv-setup code you need here 

if __name__ == '__main__':
    main()

用法:

% python wrapper.py [path]

答案 2 :(得分:0)

选项--extra-search-dir允许定义包含所需版本的setuptools的本地目录。这在docs

中有解释