最近、Python でいろいろなプログラムを書くようになりましたが、ライブラリの依存性の管理が面倒になってきたので Pipenv で環境を管理するようにしてみました。
Pipenv: Python Dev Workflow for Humans — pipenv 2018.11.27.dev0 documentation
Pipenv is a tool that aims to bring the best of all packaging worlds (bundler, composer, npm, cargo, yarn, etc.) to the Python world.
これを使うと、プロジェクト内にある Pipenv というファイル内に pip モジュールへの依存性が記述されるようになります。
具体的にはこんな感じのファイルです。
$ cat Pipfile
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true
[dev-packages]
[packages]
stomp-py = "*"
[requires]
python_version = "3.7"
他の環境にプログラムを移植した場合には、最初に pipenv update するだけで、pipenv が必要な pip モジュールを自動的にインストールしてくれます。プログラムが多数の pip モジュールに依存している場合には、プログラムがコケる度に pip でインストールするという手間がなくなるので、圧倒的に作業が楽になります。ちょうど Ruby の Bundler における Gemfile ような感じですね。
以下、CentOS 7 へのインストール手順です。
† CentOS 7 にインストール
こんな感じで導入できるはずです。
# 必要なライブラリを導入
sudo yum install -y git gcc zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel libuuid-devel xz-devel libffi-devel openssl11-devel
# pyenv を github から clone
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
# pyenv の環境変数を設定
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bash_profile
exec "$SHELL" -l
# virtualenv のディレクトリ(.venv)をプロジェクト内に作るように設定
echo 'export PIPENV_VENV_IN_PROJECT=1' >> ~/.bash_profile
# python 3.7.4 をインストールしてデフォルトに設定
CPPFLAGS=-I/usr/include/openssl11 \
LDFLAGS=-L/usr/lib64/openssl11 \
pyenv install
pyenv install 3.7.4
pyenv global 3.7.4
# pipenv をインストール
pip install --upgrade pip
pip install pipenv
† 実際に試してみると・・・・
デフォルトの pip のモジュールの一覧を出してみるとこんな感じになります。
$ pip list
Package Version
---------------- ----------
certifi 2019.6.16
pip 19.2.1
pipenv 2018.11.26
setuptools 40.8.0
virtualenv 16.7.2
virtualenv-clone 0.5.3
ここで、hoge というディレクトリを掘って、その中に新しい環境を作り、そこに stomp.py を導入してみるとこんな感じになります。
環境にモジュールをインストールする場合には pipenv install を、環境でプログラムを実行する場合には pipenv run を使います。
$ mkdir hoge
$ cd hoge/
$ pipenv --python 3
Creating a virtualenv for this project…
Pipfile: /home/hsur/hoge/Pipfile
Using /home/hsur/.pyenv/versions/3.7.4/bin/python (3.7.4) to create virtualenv…
? Creating virtual environment...Already using interpreter /home/hsur/.pyenv/versions/3.7.4/bin/python
Using base prefix '/home/hsur/.pyenv/versions/3.7.4'
New python executable in /home/hsur/hoge/.venv/bin/python
Installing setuptools, pip, wheel...
done.
Running virtualenv with interpreter /home/hsur/.pyenv/versions/3.7.4/bin/python
? Successfully created virtual environment!
Virtualenv location: /home/hsur/hoge/.venv
Creating a Pipfile for this project…
$ pipenv install stomp.py
Installing stomp.py…
Adding stomp.py to Pipfile's [packages]…
? Installation Succeeded
Pipfile.lock not found, creating…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
? Success!
Updated Pipfile.lock (c9a086)!
Installing dependencies from Pipfile.lock (c9a086)…
? ???????????????????????????????? 1/1 ? 00:00:01
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.
$ pipenv run pip list
Package Version
---------- -------
docopt 0.6.2
pip 19.2.1
setuptools 41.0.1
stomp.py 4.1.22
wheel 0.33.4
思っていたよりも簡単に導入できるものですね。