python pipでインストール用ファイルをローカルに保存しておく
アプリケーションを別のサーバーに載せ替えたい等の理由で、インストールされているpythonパッケージを、別のマシンへ展開したいことがあります。
こういう時pipなら、pip freezeでパッケージ名とバージョンの一覧を出力して、他マシンでその一覧を元にinstallすると簡単です。
[HOST A]$ pip freeze > /nas/pip/requirements.txt [HOST A]$ cat /nas/pip/requirements.txt BeautifulSoup==3.2.1 Flask==0.10.1 Jinja2==2.7.3 ... terminado==0.5 toolz==0.7.1 tornado==4.1 wheel==0.24.0 [HOST B]$ pip install -r /nas/pip/requirements.txt
しかし、これだとfreezeで一覧にした後に、ライブラリの特定のバージョンが公開停止されたり、あるいはライブラリ自体が
公開停止されると、うまく展開できなくなるか、一部の機能が動かない(とか、変に動いたりする)はず。
それだと困るので、今の状態で、予め依存するライブラリも含め、全てローカルに保存しておきたい。
しかしPyPIから一つ一つ落としてくるのも手間です。
こういうときに便利なコマンドは無いのか…
installコマンドに--downloadというオプションがありました。
指定すると、インストール用の.tar.gzや.whlファイルをフォルダに放り込んでくれます。
ダウンロードまでで、インストールはされません。これで今あるpython環境をローカルに落としておけます。
[HOST A]$ pip freeze > /nas/pip/requirements.txt [HOST A]$ pip install --download /nas/pip/archive -r /nas/pip/requirements.txt
あとは展開される側でそのフォルダを参照してpip installすればOKです。
[HOST B]$ pip install --no-index --find-links=file:///nas/pip/archive -r /nas/pip/requirements.txt ...(略) Collecting wheel==0.24.0 (from -r ..\requirements.txt (line 34)) Installing collected packages: pyquery, pytz, pyzmq, redis, requests, selenium, tornado, terminado, toolz, wheel Running setup.py install for pyquery Running setup.py install for redis Running setup.py install for selenium Running setup.py install for tornado Running setup.py install for terminado Running setup.py install for toolz Successfully installed pyquery-1.2.9 pytz-2014.10 pyzmq-14.6.0 redis-2.10.3 requests-2.5.1 selenium-2.44.0 terminado-0.5 toolz-0.7.1 tornado-4.1 wheel-0.24.0
なお、cx_OracleとかscipyとかpylzmaとかのC拡張が含まれる場合は、関連するコンパイラなども持っておく必要がある気がします。
あと、pip以外からパッケージをインストールしている場合(aptとかyumで入れてる場合)、当然これでは展開できないので要注意です。
※pip 1.5.6(python2.7)で動作確認してます。
参考:
User Guide − pip 6.1.1 documentation
How to use Python's pip to download and keep the zipped files for a package? - Stack Overflow