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

3 投票
3 回答
1404 浏览
提问于 2025-04-16 17:27
setuptools-0.6c11-py2.4.egg

我所在的大公司使用的是一个定制版的Setuptools。这种私有的Setuptools版本是为了应对我们公司特有的一些网络和安全问题。简单来说,标准的Setuptools和Distribute在我们的环境中无法正常工作。

我想在我们的系统上开始使用Ian Bicking的优秀工具VirtualEnv,特别是在我们的测试系统中,因为我们需要为测试代码设置很多独立的环境,比如在我们的持续集成环境中。

不幸的是,每当我尝试创建一个新的虚拟环境时,virtualenv工具都会试图获取并安装最新的官方版本的Setuptools。这会失败,原因如上所述,而且公司的防火墙也会阻止这个操作。

我想要安装我们定制的版本,可能叫做:

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

这个包总是可以在系统的全局site-packages中找到。我也可以保证它在我们所有的公司包服务器上都存在。

你能帮我让我的virtualenv使用我定制的setuptools,而不是常规版本的setuptools吗?

3 个回答

0

有一个选项叫做 --extra-search-dir,这个选项可以让你指定一个本地文件夹,里面放着你想要的 setuptools 版本。具体的说明可以在 文档中找到。

1

我开始写自己的包装脚本,这些脚本会导入虚拟环境(virtualenv)。这样做的主要原因是我用dpkgs来安装大部分依赖项,包括distribute,所以我希望在创建新环境时避免下载额外的副本——这样做还有个好处,就是运行速度更快。

这里有一个基础的包装脚本,你可以用它作为起点。我在代码中添加了注释,告诉你可以在哪里插入代码,将你自定义的setuptools代码链接或复制到虚拟环境中:

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

这个名字是死写在virtualenv.py文件里的。你要么修改这个virtualenv.py,要么把你修改过的setuptools包命名为'setuptools-0.6c11-py2.4.egg'。

撰写回答