【问题标题】:Installing Python's easy_install using ez_setup.py from behind a proxy server使用 ez_setup.py 从代理服务器后面安装 Python 的 easy_install
【发布时间】:2012-11-23 21:03:40
【问题描述】:

在使用代理服务器的公司网络上,有没有办法使用 ez_setup.py 安装 Python 的 easy_install?目前,我收到连接超时:

Downloading http://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.egg
Traceback (most recent call last):
  File "C:\jsears\python\ez_setup.py", line 278, in <module>
    main(sys.argv[1:])
  File "C:\jsears\python\ez_setup.py", line 210, in main
    egg = download_setuptools(version, delay=0)
  File "C:\jsears\python\ez_setup.py", line 158, in download_setuptools
    src = urllib2.urlopen(url)
  File "C:\jsears\Python27\lib\urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "C:\jsears\Python27\lib\urllib2.py", line 400, in open
    response = self._open(req, data)
  File "C:\jsears\Python27\lib\urllib2.py", line 418, in _open
    '_open', req)
  File "C:\jsears\Python27\lib\urllib2.py", line 378, in _call_chain
    result = func(*args)
  File "C:\jsears\Python27\lib\urllib2.py", line 1207, in http_open
    return self.do_open(httplib.HTTPConnection, req)
  File "C:\jsears\Python27\lib\urllib2.py", line 1177, in do_open
    raise URLError(err)
urllib2.URLError: <urlopen error [Errno 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond>

【问题讨论】:

    标签: python proxy easy-install


    【解决方案1】:

    我刚刚遇到了同样的问题,这是我找到的解决方案。我承认这并不理想,但这是我在 Windows 上找到解决此问题的唯一方法。

    1. 下载。 ez_setup.py。
    2. 编辑以下行以显示文件希望将压缩包下载到的位置:

    打印保存到

    def download_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL,
                            to_dir=os.curdir, delay=15,
                            downloader_factory=get_best_downloader):
    # making sure we use the absolute path
    to_dir = os.path.abspath(to_dir)
    tgz_name = "setuptools-%s.tar.gz" % version
    url = download_base + tgz_name
    saveto = os.path.join(to_dir, tgz_name)
    print saveto
    if not os.path.exists(saveto):  # Avoid repeated downloads
        log.warn("Downloading %s", url)
        downloader = downloader_factory()
        downloader(url, saveto)
    return os.path.realpath(saveto)
    

    在我的例子中,当您执行脚本时,这会提供以下输出:“C:\Python27>python.exe ez_setup.py”

    输出:

    C:\Python27\setuptools-1.4.2.tar.gz 正在下载https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz 使用“2”参数调用“DownloadFile”的异常:“远程服务器返回错误:(407) 需要代理身份验证。” 在行:1 字符:47 + (新对象 System.Net.WebClient).DownloadFile https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz', 'C:\Python27\setuptools-1.4.2.tar.gz') + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : DotNetMethodException

    1. 从上面的 https 链接下载包并将其放置在我的情况下它期望的位置“C:\Python27\”

    这个文件被放置在这个位置会触发这个逻辑语句:

    if not os.path.exists(saveto):  # Avoid repeated downloads
        log.warn("Downloading %s", url)
        downloader = downloader_factory()
        downloader(url, saveto)
    return os.path.realpath(saveto)
    

    就像变魔术一样,软件包将被安装。

    【讨论】:

      【解决方案2】:

      如果您已经设置了 http_proxy/https_proxy 环境变量,您可以告诉 ez_setup.py 不要使用 PowerShell。 PowerShell 不使用 HTTP_PROXY/HTTPS_PROXY 环境变量。按照此回复的第一部分进行操作。

      对于可能不知道如何设置环境变量的人,请参阅第 2 节以上。

      阻止 ez_setup.py 使用 PowerShell

      进入 ez_install.py 并找到以下部分:

      def has_powershell():
          if platform.system() != 'Windows':
              return False
          cmd = ['powershell', '-Command', 'echo test']
          devnull = open(os.path.devnull, 'wb')
          try:
              try:
                  subprocess.check_call(cmd, stdout=devnull, stderr=devnull)
              except:
                  return False
          finally:
              devnull.close()
          return True
      

      并将其更改为

      def has_powershell():
           return False
      

      ez_install.py 将使用您的环境 HTTP_PROXY/HTTPS_PROXY,可以从命令行或通过控制面板进行设置。

      临时命令行:

      set HTTP_PROXY=http://proxy.example.com
      set HTTPS_PROXY=https://proxy.example.com
      

      注意:如果您这样做,您必须在运行这些命令的同一命令窗口中运行“python ez_setup.py”。

      永久命令行(仅限用户):

      setx HTTP_PROXY "http://proxy.example.com"
      setx HTTPS_PROXY "https://proxy.example.com"
      

      永久命令行(机器又名所有用户):

      setx HTTP_PROXY "http://proxy.example.com" /M
      setx HTTPS_PROXY "https://proxy.example.com" /M
      

      通过控制面板永久保存:

      1. 开始 -> 控制面板 -> 用户帐户
      2. 在左侧面板中,点击“更改我的环境变量”
      3. 单击“用户变量”或“系统变量”中的“新建..”(取决于您想要的)
      4. 设置变量名称:HTTP_PROXY 和变量值:http://proxy.example.com
      5. 点击“用户变量”或“系统变量”中的“新建..”(取决于您想要的)
      6. 设置变量名称:HTTPS_PROXY 和变量值:https://proxy.example.com
      7. 点击“确定”

      【讨论】:

        【解决方案3】:

        在 Windows 7 上,使用 PowerShell,上面的代理设置将被忽略,该工具将无法工作。但我找到了解决方案。

        我通过添加修改了例程 download_file_powershell

        [System.Net.WebRequest]::DefaultWebProxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials;
        

        在用于通过 WebClient 类下载的 scriptlet 中。下面是完整的 download_file_powershell 函数:

        def download_file_powershell(url, target):
        """
        Download the file at url to target using Powershell (which will validate
        trust). Raise an exception if the command cannot complete.
        """
        target = os.path.abspath(target)
        cmd = [
            'powershell',
            '-Command',
            "[System.Net.WebRequest]::DefaultWebProxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials;  (new-object System.Net.WebClient).DownloadFile(%(url)r, %(target)r)" % vars(),
        ]
        subprocess.check_call(cmd)
        

        【讨论】:

        • Setuptools 3.6 集成了这种技术。您能否确认该技术适用于所有版本的 Powershell,甚至在不需要代理凭据的情况下?
        • 好吧,我很少使用 PowerShell,所以我无法确认,抱歉。
        • @valir 你能告诉我们我应该在哪里进行编辑吗?它是在 ez_install.py 中还是在其他 python 模块中?还是其他地方?
        【解决方案4】:

        你也可以在你的代码中设置:

        import urllib2
        
        proxy = urllib2.ProxyHandler({'http':'http://username:password@proxy_host:port'})
        auth = urllib2.HTTPBasicAuthHandler()
        opener = urllib2.build_opener(proxy, auth, urllib2.HTTPHandler)
        urllib2.install_opener(opener)
        

        【讨论】:

        • 是的,我可以修改 ez_setup.py,但该脚本是由 PEAK 提供的,所以我不想在他们的脚本中进行修改。感谢您的建议,因为这将有助于我编写的其他脚本。
        • 这在 Windows 上对我有用,而设置环境变量却没有。我在 ez_setup 脚本的开头添加了上述行,并且还包含了相同的 https 代理(只是字典中的另一个条目,使用 https 而不是 http)。
        【解决方案5】:

        显然,您可以简单地设置一个环境变量:

        导出 http_proxy=http://:@:

        例如:

        导出 http_proxy=http://admin:password@proxy.example.com:80

        【讨论】:

          猜你喜欢
          • 2017-07-06
          • 1970-01-01
          • 1970-01-01
          • 2015-07-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-17
          • 1970-01-01
          相关资源
          最近更新 更多