3

我工作的大公司使用自定义版本的 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。

4

3 回答 3

2

该名称在 virtualenv.py 中硬编码。您必须修补 virtualenv.py 或将修补后的 setuptools egg 命名为“setuptools-0.6c11-py2.4.egg”

于 2011-05-11T17:39:39.527 回答
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]
于 2011-05-11T18:08:29.943 回答
0

有一个选项--extra-search-dir允许定义包含所需版本的 setuptools 的本地目录。这在文档中进行了解释。

于 2014-01-01T21:19:48.033 回答