たまにインターネットと疎通がないマシンをデプロイしなきゃいけないこともあると思う。 今回は、そんな時にどうやって 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 を使ってビルドするようにしよう。
スマートPythonプログラミング: Pythonのより良い書き方を学ぶ
- 作者: もみじあめ
- 発売日: 2016/03/12
- メディア: Kindle版
- この商品を含むブログを見る