CUBE SUGAR CONTAINER

技術系のこと書きます。

インターネットと疎通がないマシンに Python パッケージをインストールする

たまにインターネットと疎通がないマシンをデプロイしなきゃいけないこともあると思う。 今回は、そんな時にどうやって Python のパッケージを対象ホストにインストールすればいいかについて書く。 要約を先に書いておくと、まず OS のパッケージシステムを使って Python のパッケージマネージャ pip をインストールした上で、Wheel という Python のパッケージング形式でビルドしたものを使ってインストールすればいい。

検証の環境には CentOS7 を使った。

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

Python のパッケージマネージャ pip をインストールする

まずは Wheel 形式の Python パッケージを扱うために、Python のパッケージマネージャ pip をインストールする。

CentOS7 であれば、あらかじめ python-pip の RPM をダウンロードしよう。

$ sudo yum -y install epel-release
$ sudo yum install python-pip --downloadonly --downloaddir=.
$ ls
python-pip-7.1.0-1.el7.noarch.rpm

上記の RPM ファイルをデプロイ対象のホストに持って行ってインストールする。 これなら対象ホストがインターネットと疎通がなくても実行できる。

$ sudo yum -y install python-pip-7.1.0-1.el7.noarch.rpm

目当てのパッケージの Wheel をビルドする

次に目当てのパッケージを Wheel 形式にビルドする。

Wheel 形式にビルドするには、ビルドするマシンに python-wheel が必要になるので入れておく。 また、Wheel 形式では C 言語拡張モジュールがコンパイル済みの状態でパッケージングされるため、コンパイルに必要な依存ライブラリもここで入れておく必要がある。

$ sudo yum -y install python-devel python-wheel

あるいは python-pip が入っているのであれば pip コマンドで入れても構わない。

$ sudo pip install wheel

お目当てのパッケージが PyPI にアップロードされている場合は pip wheel サブコマンドで依存ライブラリを含めて Wheel をビルドできる。

$ pip wheel requests
You are using pip version 7.1.0, however version 7.1.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Collecting requests
/usr/lib/python2.7/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
  Downloading requests-2.7.0-py2.py3-none-any.whl (470kB)
    100% |████████████████████████████████| 471kB 40kB/s 
  Saved ./wheelhouse/requests-2.7.0-py2.py3-none-any.whl
Skipping requests, due to already being wheel.

これで wheelhouse ディレクトリに Wheel パッケージができあがる。

$ ls wheelhouse/
requests-2.7.0-py2.py3-none-any.whl

あるいは、自作のパッケージであれば python setup.py bdist_wheel を実行する。 この場合、依存パッケージはビルドされないので、そちらは pip wheel コマンドを使って用意する。

$ git clone https://github.com/kennethreitz/requests.git
$ cd requests/
$ python setup.py bdist_wheel

これだと dist ディレクトリ以下に Wheel パッケージができあがる。

$ ls dist/
requests-2.7.0-py2.py3-none-any.whl

Wheel パッケージをインストールする

あとは先ほどビルドした Wheel パッケージをデプロイ対象ホストに持って行ってインストールすれば良い。

$ sudo pip install --use-wheel --no-index --find-links=wheelhouse wheelhouse/requests-2.7.0-py2.py3-none-any.whl 
Ignoring indexes: https://pypi.python.org/simple
Processing ./wheelhouse/requests-2.7.0-py2.py3-none-any.whl
Installing collected packages: requests
Successfully installed requests-2.7.0

pip list サブコマンドで確認するとパッケージがインストールされていることがわかる。

$ pip list | grep requests
You are using pip version 7.1.0, however version 7.1.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
requests (2.7.0)

いじょう。

まとめ

今回はインターネットに疎通のないマシンに、Wheel 形式でビルドした Python パッケージをインストールする方法について書いた。 尚、注意点としては Wheel は C 言語拡張モジュールがコンパイル済みの状態で同梱されるため、デプロイ対象と同じ OS を使ってビルドするようにしよう。