Category Archives: python

Python の pip search コマンドが Proxy 経由で動作しない

Python の pip search コマンドを proxy 経由で実行するとエラーになるようです。たとえば、pulp という名前のパッケージを検索しようとすると以下のように例外が発生してエラーになります。環境は Fedora 20, Python 2.7.5 を使用しています。

# pip search pulp --proxy=http://proxy.example.com:8080
Exception:
Traceback (most recent call last):
...
gaierror: [Errno -2] Name or service not known

これについてちょっと調べてみたところ、どうやら以下の GitHub のサイトにパッチが提供されていることがわかりました。

この問題の内容についての説明は以下の URL にあります。
https://github.com/pypa/pip/pull/1180/
必要なパッチについては以下の URL に提供されています。
https://github.com/pypa/pip/pull/1180/files/

さっそく、このパッチを適用してみましょう。まずはシステム内の search.py の場所を確認します。

# locate pip/commands/search.py
...
/usr/lib/python2.7/site-packages/pip/commands/search.py
/usr/lib/python2.7/site-packages/pip/commands/search.pyc
...

このディレクトリに移動し、Github からダウンロードした search.py に入れ替えます。念の為、変更前の search.py は search.py-BAK としてバックアップを取得しておきます。

# cd /usr/lib/python2.7/site-packages/pip/commands/
# mv search.py search.py-BAK
# wget https://raw.githubusercontent.com/cula/pip/master/pip/commands/search.py

さらに追加のモジュール xmlrpclib_ext.py をダウンロードします。

# cd /usr/lib/python2.7/site-packages/pip/
# wget https://raw.githubusercontent.com/cula/pip/master/pip/xmlrpclib_ext.py

以上でパッチの適用が完了です。再度、pip search コマンドを proxy 経由で実行して動作確認してみます。

# pip search pulp --proxy=http://proxy.example.com:8080
PuLP - PuLP is an LP modeler written in python. PuLP can
       generate MPS or LP files and call GLPK, COIN
       CLP/CBC, CPLEX, and GUROBI to solve linear
       problems.
...

今度は検索結果が正常に返されました。検索するだけのコマンドなので動作しなくても大して問題はないですが、Python 習い始めの自分はいきなりビビってしまいました。

(2015.03.20 追記)
上記のバグは Python 本家ではすでに修正されており、以下の方法で更新すると回避できるようです。Linux ディストリビューションの RPM による提供は遅れているようです。

念の為、python-pip、python-setuptools をインストールする。

# yum -y install python-pip
# yum -y install python-setuptools

pip コマンドで pip 自身および setuptools をアップデートする。

# pip install --upgrade pip --proxy=http://proxy.example.com:8080
# pip install --upgrade setuptools --proxy=http://proxy.example.com:8080

python を利用する場合、pip および setuptools を最新にアップデートしておくと何かとトラブルを回避できるとのことです。