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