如何让VirtualEnv使用自定义版本的setuptools?
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 个回答
有一个选项叫做 --extra-search-dir
,这个选项可以让你指定一个本地文件夹,里面放着你想要的 setuptools 版本。具体的说明可以在 文档中找到。
我开始写自己的包装脚本,这些脚本会导入虚拟环境(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]
这个名字是死写在virtualenv.py文件里的。你要么修改这个virtualenv.py,要么把你修改过的setuptools包命名为'setuptools-0.6c11-py2.4.egg'。