【问题标题】:Installing python modules through proxy通过代理安装 python 模块
【发布时间】:2012-08-27 14:47:04
【问题描述】:

我想安装几个使用easy_install 的python 包。他们在设置脚本中使用 urrlib2 模块。我尝试使用公司代理让 easy_install 下载所需的软件包。因此,为了测试代理连接,我尝试了以下代码。我不需要为 IE 中的代理提供任何凭据。

proxy = urllib2.ProxyHandler({"http":"http://mycompanyproxy-as-in-IE:8080"})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
site = urllib2.urlopen("http://google.com")

Error:
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "C:\Python27\lib\urllib2.py", line 126, in
 return _opener.open(url, data, timeout)
 File "C:\Python27\lib\urllib2.py", line 406, in
  response = meth(req, response)
 File "C:\Python27\lib\urllib2.py", line 519, in
  'http', request, response, code, msg, hdrs)
 File "C:\Python27\lib\urllib2.py", line 444, in
return self._call_chain(*args)
 File "C:\Python27\lib\urllib2.py", line 378, in
   result = func(*args)
 File "C:\Python27\lib\urllib2.py", line 527, in
   raise HTTPError(req.get_full_url(), code, msg
  urllib2.HTTPError: HTTP Error 407: AuthorizedOnly

我的代码有问题吗?还是代理不允许来自 python 进程的连接?我可以通过设置代理来安装 R 包。

【问题讨论】:

  • 您确定您的公司代理不需要凭据吗?也许 IE 记得您很久以前或您公司的 IT 人员输入的一些凭据?
  • 也许,我不确定它是否与我的 PC 或 Intranet passowrd 的登录凭据相同?为了更新 R 中的包,我只使用 --internet2 选项。
  • 如果您的计算机是域的成员,并且您的代理是 Windows 服务器,那么您的代理几乎肯定需要您的域登录。更糟糕的是,它可能希望在 NTLM 中使用它。

标签: python proxy urllib2


【解决方案1】:

设置以下环境变量:

HTTP_PROXY=http://user:password@your-company-proxy.com:8080

还有

HTTPS_PROXY=http://user:password@your-company-proxy.com:8080

如果您的代理端口不是 8080,您也应该将 8080 更改为适当的端口号。
如果您无权修改全局系统变量(只有拥有本地管理员权限才能这样做),只需将其添加到您的用户级变量即可。

My Computer &gt; Properties &gt; Advanced &gt; Environment Variables 设置它(或“高级属性”,如果在 Windows 7 中)

设置好该变量后,关闭所有cmd 窗口并再次启动命令提示符。然后就可以使用普通的setuptoolseasy_installpip来下载安装Python包了。

如果您需要通过 Python 使用它; requests 库负责处理 httpliburllib 的怪癖。

requests 会自动读取HTTP_PROXY 并使用代理;但这里是您手动操作的方法(来自docs 的示例):

import requests

proxies = {
  "http": "http://user:pass@foo.bar.zoo:8080",
  "https": "http://user:pass@foo.bar.zoo:8080",
}

requests.get("http://example.org", proxies=proxies)

【讨论】:

    【解决方案2】:

    您可以执行以下命令:

    sudo pip --proxy 安装

    【讨论】:

      【解决方案3】:

      通过 Windows cmd/PowerShell 使用 setx http_proxy 和 https_proxy 工作。

      两者都是需要的,因为仅仅设置 http_proxy 是不够的。

      如上所述,但为 Windows 配置:

      setx HTTP_PROXY http://user:password@your-company-proxy.com:8080

      还有

      setx HTTPS_PROXY http://user:password@your-company-proxy.com:8080

      【讨论】:

        【解决方案4】:

        错误提示您还需要授权。 试试下面的代码:

        proxy = urllib2.ProxyHandler({"http":"http://mycompanyproxy-as-in-IE:8080"})
        proxy_auth_handler = urllib2.HTTPBasicAuthHandler()
        proxy_auth_handler.add_password('realm', 'host', 'username', 'password')
        opener = build_opener(proxy, proxy_auth_handler)
        urllib2.install_opener(opener)
        site = urllib2.urlopen("http://google.com")
        

        我认为这应该可行。

        【讨论】:

        • “领域”是我登录的域吗?什么是“主机”?
        • -- add_password(realm, uri, user, passwd) -- 'realm' 只是信息,它是一个字符串,例如:“XYZ Application”,uri 可以是单个 URI,也可以是一系列 URI。 realm、user 和 passwd 必须是字符串。这会导致 (user, passwd) 在为领域和任何给定 URI 的超级 URI 提供身份验证时用作身份验证令牌。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-09
        • 1970-01-01
        • 1970-01-01
        • 2016-06-27
        • 1970-01-01
        • 2020-03-03
        • 2017-10-16
        相关资源
        最近更新 更多