【问题标题】:How do I make VirtualEnv use a custom version of setuptools?如何让 VirtualEnv 使用自定义版本的 setuptools?
【发布时间】:2011-08-23 11:55:24
【问题描述】:

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

【问题讨论】:

    标签: python virtualenv setuptools distribute


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我开始编写自己的导入 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]
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2021-04-23
          • 2013-10-07
          • 1970-01-01
          • 2021-03-22
          • 1970-01-01
          • 1970-01-01
          • 2016-09-10
          • 2010-12-29
          • 2016-06-20
          相关资源
          最近更新 更多