pythonの便利なパッケージ管理システムのpipを
会社で使っていたら、searchするとエラーを吐くことが判明。
pipのバージョンは1.1。
調べてみると、pip searchがプロキシを通さないという問題があるらしい
The search command ignore proxy settings
多分こんな感じのエラーが出る。
File "/usr/lib/python2.6/httplib.py", line 776, in _send_output self.send(msg) File "/usr/lib/python2.6/httplib.py", line 735, in send self.connect() File "/usr/lib/python2.6/httplib.py", line 716, in connect self.timeout) File "/usr/lib/python2.6/socket.py", line 500, in create_connection for res in getaddrinfo(host, port, 0, SOCK_STREAM): gaierror: [Errno -2] Name or service not known
どうやらxmlrpcがproxyを使わないらしい。
解決方法が示されているが、違うチケットに投げられ、放置されているくさい
そこでリンク先の上の方に書いてあるパッチを当てる。
リンク先ではlstripを使って「http://」を削除しているが、
実はこれだと、host名の先頭にhttpのいずれかの文字があるとそれも消されてしまう。
以下修正版のdiff。
*** download.py 2012-05-17 14:58:47.800679029 +0900 --- download.py.mod20120517 2012-05-17 14:58:01.300737662 +0900 *************** *** 6,11 **** --- 6,12 ---- import shutil import sys import tempfile + import httplib from pip.backwardcompat import (md5, copytree, xmlrpclib, urllib, urllib2, urlparse, string_types, HTTPError) from pip.exceptions import InstallationError *************** *** 22,28 **** 'unpack_file_url', 'is_vcs_url', 'is_file_url', 'unpack_http_url'] ! xmlrpclib_transport = xmlrpclib.Transport() def get_file_content(url, comes_from=None): --- 23,44 ---- 'unpack_file_url', 'is_vcs_url', 'is_file_url', 'unpack_http_url'] ! class ProxiedTransport(xmlrpclib.Transport): ! def make_connection(self, host): ! self.realhost = host ! proxy = urlopen.get_proxy() ! if proxy: ! if proxy.startswith("http://"): ! proxy =proxy[len('http://'):] ! h = httplib.HTTP(proxy) ! else: ! h = httplib.HTTP(host) ! return h ! def send_request(self, connection, handler, request_body): ! connection.putrequest("POST", 'http://%s%s' % (self.realhost, handler)) ! def send_host(self, connection, host): ! connection.putheader('Host', self.realhost) ! xmlrpclib_transport = ProxiedTransport() def get_file_content(url, comes_from=None):
上記の通りに、pipの中のdownload.pyを変更すればOK.
間違った変更を加えると、動かなくなるので注意。
ちなみに、download.pyはわたしの環境では、
/usr/local/lib/python2.6/dist-packages/pip-1.1-py2.6.egg/pip/download.py
とかにある。
これがベストなやり方ではないかもしれないが、とりあえず動く。