CUBE SUGAR CONTAINER

技術系のこと書きます。

Python: インターネットと疎通がない環境に Python パッケージをインストールする (改)

このブログでは、以前にインターネットと疎通のない環境で Python パッケージをインストールする方法について書いたことがある。 具体的には Wheel でパッケージングした配布物を pip を使ってインストールしていた。

blog.amedama.jp

ただ、上記の記事にはひとつ問題点が残されていた。 そもそも Wheel をインストールするのに必要な pip を OS のパッケージ管理システム (yum) を通してインストールしていたことだ。 このやり方では、OS が提供するパッケージをそのまま使った場合には古いバージョンの pip しか使うことができない。 それに pip 自体も Python のパッケージなので、その管理が yum と pip というふたつのシステムにまたがることになる。

今回は、その解決策がわかったので紹介することにした。 ポイントは get-pip.py を pip コマンドの代わりとして使うことだ。

使った環境は次の通り。

$ cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
$ uname -r
3.10.0-327.18.2.el7.x86_64

下準備

もし OS の提供する pip や setuptools がインストールされているときは、あらかじめ削除しておこう。

$ sudo yum remove -y python-setuptools python-pip

パッケージング (インターネットと疎通のあるホストで実行する)

ここからはインストールしたい Python パッケージなどのパッケージングを行う。

まずは、普段なら pip をインストールするために使う get-pip.py をダウンロードしておこう。

$ wget https://bootstrap.pypa.io/get-pip.py

次に Wheel を入れるディレクトリを作っておく。

$ mkdir wheelhouse

これは単に一箇所にまとめておくために作っている。

そして pip の Wheel ファイルを作って先ほど作ったディレクトリの中に入れる。

$ python get-pip.py wheel pip --no-cache-dir --download wheelhouse

上記の操作で get-pip.py を Python スクリプトとして実行している。 実は get-pip.py は一部の機能は絞られるものの pip コマンドの代わりとして使うことができる。

pip 以外にも、インストールしたい Python パッケージの例として requests の Wheel を用意しておこう。

$ python get-pip.py wheel requests --no-cache-dir --download wheelhouse

用意した Wheel ファイルは次の通り。

$ ls wheelhouse | grep \.whl$
pip-8.1.2-py2.py3-none-any.whl
requests-2.10.0-py2.py3-none-any.whl
setuptools-22.0.0-py2.py3-none-any.whl
wheel-0.29.0-py2.py3-none-any.whl

上記のパッケージをインストールする (インターネットと疎通のない) ホストには、これらと先ほどダウンロードした get-pip.py を持っていく。

インストール (インターネットと疎通のないホストで実行する)

ここからは、先ほど作った Wheel ファイルをインストールする先の話。 本来はインターネットと疎通のないホストで実行することになるけど、ここではさっきビルドしたのと同じところでやってしまうことにする。

インストールにはパッケージングと同じように get-pip.py を使う。 get-pip.py は pip コマンドの代わりになるので、これを使って pip の Wheel パッケージをインストールする。 このとき --no-index オプションと --find-links オプションを併用することで、パッケージの解決が指定したディレクトリに閉じて実行される。

$ sudo python get-pip.py --no-index --find-links=wheelhouse pip

これで pip がインストールできた。

$ pip list | egrep "(pip|setuptools|wheel)"
pip (8.1.2)
setuptools (22.0.0)
wheel (0.29.0)

pip さえインストールできてしまえばこちらのものなので、あとはふつうに pip コマンドで Wheel ファイルをインストールしていく。

$ sudo pip --no-index --find-links=wheelhouse requests

もちろん get-pip.py を使い続けても良いけどね。

無事に requests もインストールできた。

$ pip list | grep requests
requests (2.10.0)

ばっちり。

まとめ

  • Wheel ファイルにはブートストラップ問題がある
  • Wheel ファイルをインストールするための pip をどうインストールするか
  • この問題は get-pip.py を使って解決できる
  • get-pip.py は pip コマンドの代わりとして使える
  • pip の Wheel ファイルを get-pip.py を使ってインストールしよう