2012-12-05 88 views
12

在使用代理服务器的公司网络上使用ez_setup.py安装Python easy_install的方法是什么?目前,我收到一个连接超时:从代理服务器后面使用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> 

回答

6

显然,你可以简单地设置环境变量:

export http_proxy=http://<user>:<password>@<proxy_host_name>:<port>

例如:

export http_proxy=http://admin:[email protected]:80

+4

在windows上这两个环境变量似乎不起作用 – yorua007

+0

我的情况确实工作得很好 – eusoubrasileiro

4

你也可以在代码中设置:

import urllib2 

proxy = urllib2.ProxyHandler({'http':'http://username:[email protected]_host:port'}) 
auth = urllib2.HTTPBasicAuthHandler() 
opener = urllib2.build_opener(proxy, auth, urllib2.HTTPHandler) 
urllib2.install_opener(opener) 
+1

是的,我可以修改ez_setup.py,但该脚本是由PEAK提供的,所以我不想在他们的脚本中进行破解。感谢您的提议,因为这将有助于我编写的其他脚本。 – jsears

+0

这在Windows上适用于我,而设置环境变量却没有。我在ez_setup脚本的开头添加了上面的行,并且还包含了与https相同的代理(只是https中的另一个条目,而不是http)。 –

15

在Windows 7上,wi th PowerShell,上面的代理设置将被忽略,并且该工具不起作用。但我找到了解决方案。

我通过添加

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

用于通过WebClient类下载的scriptlet内部改性例程download_file_powershell。这是现在完成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) 
+1

+1支持PowerShell!谢谢。 – eckes

+0

Setuptools 3.6集成了这种技术。您是否可以确认该技术适用于所有版本的Powershell,甚至不需要代理凭证? –

+0

嗯,我很少使用PowerShell,所以我不能确认,对不起。 – valir

6

如果你已经有了一个HTTP_PROXY/https_proxy环境变量设置,你可以告诉ez_setup.py不使用PowerShell。 PowerShell不使用HTTP_PROXY/HTTPS_PROXY环境变量。按照本回复的第一部分。

对于可能不知道如何设置环境变量的人,请参阅部分2+。使用PowerShell的

停止ez_setup.py走进了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 

注:如果你这样做,你必须运行在你运行这些命令的同一个命令窗口“蟒蛇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. 单击“新建...”,在“用户变量”或“系统变量”(取决于你想要什么)在“用户变量”或“系统变量” /proxy.example.com
  4. 单击“新建...”(这取决于你想要什么)
  5. 集:
  6. 设置变量名:HTTP_PROXY和变量值:HTTP变量名称:HTTPS_PROXY和变量值:https:/proxy.example.com
  7. 单击“确定”
0

我刚碰到同样的问题,这是我找到的解决方案。我承认并不理想,但这只是我在Windows上发现这个问题的唯一方法。

  1. 下载。 ez_setup.py。
  2. 编辑以下行来告诉你该文件预计到压缩了包下载到:

打印saveto

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 \”

该文件被放置在该位置触发t他的逻辑语句如下:

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) 

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

相关问题