2012-08-27 98 views
3

我想安裝一些使用easy_install的python包。他們在他們的安裝腳本中使用urrlib2模塊。我試着用公司代理讓easy_install下載所需的軟件包。所以要測試代理連接我嘗試了下面的代碼。我不需要在IE中提供任何代理憑據。通過代理安裝python模塊

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包。

+0

你確定你公司的代理不需要憑據?也許IE記得很久以前你輸入的一些憑證,或者你公司的IT員工? – Lior

+0

也許,我不確定它是否與我的PC或intranet passowrd的登錄憑證相同?用於更新R中的包我只使用--internet2選項。 – dasman

+0

如果您的計算機是域的成員,並且您的代理服務器是Windows服務器,那麼您的代理服務器幾乎肯定希望您的域名登錄。更糟的是,它可能需要NTLM。 – kindall

回答

12

設置以下環境變量:

HTTP_PROXY=http://user:[email protected]:8080 

以及

HTTPS_PROXY=http://user:[email protected]:8080 

如果您的代理端口不是8080,你應該用相應的端口號8080更改過。
如果您無權修改全局系統變量(如果您擁有本地管理員權限,則只能這樣做),只需將其添加到用戶級別的變量即可。

設置從My Computer > Properties > Advanced > Environment Variables(或「高級屬性」如果在Windows 7中)

一旦你有一個變量設置,關閉所有窗口cmd並重新啓動命令提示符。然後你可以使用普通的setuptools easy_installpip來下載和安裝Python包。

如果您需要通過Python使用它; requests圖書館照顧httpliburllib的怪癖。

requests會自動讀取HTTP_PROXY並使用代理;但這裏是你會怎麼做手工(例如,從docs):

import requests 

proxies = { 
    "http": "http://user:[email protected]:8080", 
    "https": "http://user:[email protected]:8080", 
} 

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

那麼手動選項工作... – dasman

-1

錯誤表示您還需要授權。 請嘗試以下代碼:

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") 

我認爲這應該有效。

+0

'域'是我登錄的域名?什麼是'主人'? – dasman

+0

- add_password(realm,uri,user,passwd) - 'realm'只是信息,它是一個字符串,例如:「XYZ Application」,uri可以是單個URI,也可以是一系列URI。 realm,user和passwd必須是字符串。這將導致(user,passwd)在給定realm的任何給定URI的超級URI的身份驗證時被用作身份驗證令牌。 – deep