ひとことでいえば…
アプリ開発時には、なるべく
pipenvを使おう!
-
これまでのPythonパッケージ管理方法の問題
- まともに依存関係を扱えるパッケージマネージャーが存在しなかった。
pipはそこまで扱わない。
- 複雑なビルドが必要なパッケージの、安定した配布方法が無かった。
- どちらも、
condaにより解決するかと思われたが…- コミュニティは大きいものの、PyPA標準ではない。
- そもそも目的が異なる。
- まともに依存関係を扱えるパッケージマネージャーが存在しなかった。
-
最近は、Anacondaの利点は薄れつつある1
- pipでも各環境向けのバイナリパッケージ(
wheel)が用意されていることが多い。 - Anacondaはパッケージ一式が巨大。
- じゃあMinicondaなら…といっても、結局
condaパッケージマネージャの使い方を覚える必要がある。 condaには無いパッケージの場合はpipを併用することになるが…- バージョンの競合が生じやすい。
- Anaconda利用時は、いくつかのコマンドが置き換えられるため、思いもよらぬ副作用が生じる2
- pipでも各環境向けのバイナリパッケージ(
-
最近のPythonのパッケージ管理
- The Python Packaging Authority (PyPA) による標準化が進んでいる。
- これまでの問題は、ほぼ解消してきている。
- プロジェクト単位のパッケージ管理3: ⭐ pipenv
- ビルド済みパッケージの配布: Python Wheels
なるべくPythonコミュニティ内で標準的に使われる方法でやろう!
- 依存関係を考慮したパッケージ管理
- プロジェクト単位の仮想環境 (virtualenv) の管理
- 依存関係を記録し、他のユーザーの環境で再現すること
- 複数のバージョンのPythonインタプリタの自動セットアップ
- システムのパッケージマネージャーや、
conda、pyenvの担当です。 pyenvとの連携は可能なので、必要に応じて組み合わせてください。
- システムのパッケージマネージャーや、
- 複数のユーザーの共用環境の構築
- できなくはないが、そういう目的のものではない。
もし、pipenv コマンドがない、と表示された場合は、以下のコマンドでセットアップしてください。
# ~/.local/bin/pipenv としてインストールされます。
$ pip3 install pipenvプロジェクトのディレクトリ内で、プロジェクト用のPython仮想環境 (virtualenv) を作成します。
また、パッケージの依存関係を指定するための Pipfile というファイルが生成されます。
# システムに入っているPython3を使う場合は…
$ pipenv --three
# システムに入っているPython2を使う場合は…
# ※新規で2系を使うのはオススメしません!
$ pipenv --two初期状態では、Pipfile はこんな感じです4。
> cat Pipfile
[[source]]
name = "pypi"
verify_ssl = true
url = "https://pypi.python.org/simple"
[dev-packages]
[requires]
python_version = "3.5"
[packages]
このリポジトリでの実行例はこんな感じです。
~/work/pipenv-example master* [email protected]
> pipenv --three
Creating a virtualenv for this project…
Using /usr/bin/python3 (3.5.2) to create virtualenv…
⠋Already using interpreter /usr/bin/python3
Using base prefix '/usr'
New python executable in /home/tuxedokatze/.local/share/virtualenvs/pipenv-example-XmpDQdg-/bin/python3
Also creating executable in /home/tuxedokatze/.local/share/virtualenvs/pipenv-example-XmpDQdg-/bin/python
Installing setuptools, pip, wheel...done.
Virtualenv location: /home/tuxedokatze/.local/share/virtualenvs/pipenv-example-XmpDQdg-
Creating a Pipfile for this project…ひとつ注意すべき点があります。
このコマンドを実行すると、過去に同様のコマンドを使って仮想環境を作っていた場合でも、仮想環境が上書きされてしまいます。
(ですが、Pipfileに依存パッケージは記録されているので、復元は容易です。)
環境によっては、必要なPython処理系が入っていない場合があります。
たとえば、Ubuntu16.04の公式パッケージとしては、Python2.7およびPython3.5が利用可能ですが、
Python3.6が必要な場合はどうすればいいか、という状況です。
こういうときは、 pipenv --python <pythonコマンドのPATH> を利用すればOKです。
たとえば、どこかにあるMiniconda環境内の、Python3.6が入っている仮想環境を利用する場合は以下のようになります。
$ pipenv --python /opt/miniconda3/envs/ml36/bin/python以下は実行例です。
~/work/pipenv-example master* [email protected]
> pipenv --python /opt/miniconda3/envs/ml36/bin/python
Creating a virtualenv for this project…
Using /opt/miniconda3/envs/ml36/bin/python (3.6.4) to create virtualenv…
⠋Running virtualenv with interpreter /opt/miniconda3/envs/ml36/bin/python
Using base prefix '/opt/miniconda3/envs/ml36'
New python executable in /home/tuxedokatze/.local/share/virtualenvs/pipenv-example-XmpDQdg-/bin/python
Installing setuptools, pip, wheel...done.
Virtualenv location: /home/tuxedokatze/.local/share/virtualenvs/pipenv-example-XmpDQdg-
Creating a Pipfile for this project…その他詳細は公式ドキュメントの以下の項を参照してください。
http://pipenv-ja.readthedocs.io/ja/translate-ja/advanced.html#pipenv-and-conda
Pipenvを用いたプロジェクトの場合は、pipenv install <packagename> コマンドでパッケージをインストールします。
たとえば、このリポジトリのサンプルコードでは、Eager execution mode が利用可能な TensorFlowが必要です。
この場合は、以下のようにしてインストールできます。
$ pipenv install tensorflow-gpu==1.7.0pipenv によってインストールされたパッケージは、Pipfileに記録されます。
[packages]
tensorflow-gpu = "==1.7.0"もちろん、バージョン指定が必要ない場合は、省略しても大丈夫です。
その場合のPipfileは以下のようになります。
$ pipenv install tensorflow-gpu[packages]
tensorflow-gpu = "*"配布時には必要ないが、開発時には必要なパッケージ、というものもあるかもしれません。
テスト用ライブラリ (nose, pytest,...) や各種のツール (ipython, bpython, autopep8, ...) のように、開発時に、チーム内でバージョンを固定したいものがある場合は、以下のコマンドを使います。
$ pipenv install --dev <package-name>このコマンドでインストールされたパッケージは、Pipfile内の [dev-packages] に記録されます。
以下はその一例です。
[dev-packages]
yapf = "*"
pytest = "*"
bpython = "*"ここまでは、pipenv install コマンドで、パッケージを逐一インストールしてきましたが、
Pipfileの書式に則っていれば、Pipfileを直接編集することも可能です。
そうやって作ったPipfileからのインストールは、Pipfileがあるディレクトリ内で、pipenv install を実行すればOKです。
開発時には、シェルからプログラムを実行したり、各種のIDEやエディタからプロジェクト用の仮想環境を利用したりするはずです。
プロジェクト用の仮想環境を有効にするには、 pipenv shell コマンドを使います。
$ pipenv shell
# このように環境名が表示されるはず…
(pipenv-example-uaXO-agg) $
# プロジェクト用の環境から抜けるとき
(pipenv-example-uaXO-agg) $ exitエディタやIDEからの利用時には、プロジェクト用の仮想環境の実体のPATHを指定する必要があるかもしれません。
プロジェクト用の仮想環境の実体を確認するには、pipenv --pyや pipenv --venv コマンドが役立ちます。
pipenv-example-XmpDQdg-$ pipenv --py
/home/tuxedokatze/.local/share/virtualenvs/pipenv-example-XmpDQdg-/bin/python
pipenv-example-XmpDQdg-$ pipenv --venv
/home/tuxedokatze/.local/share/virtualenvs/pipenv-example-XmpDQdg-現状、Pipenvで作成したプロジェクト用の仮想環境を、自動的に見つけてくれるものは少ないです。
http://pipenv-ja.readthedocs.io/ja/translate-ja/advanced.html#community-integrations
ただし、上記のように、実体は virtualenv なので、そのディレクトリやパスを指定すれば、多くの場合問題ありません。
プロジェクトを公開・配布するときには、Pipfile と Pipfile.lock も忘れずに含めてください。
Pipfile.lock は必須ではありませんが、なるべく含めてください。
というのは、このファイルには、各種パッケージのハッシュ値とバージョンが厳密に記録されているため、開発者と全く同じ環境を再現するために必要になることが多いです。
Pipfileは手動で編集しても大丈夫ですが、Pipfile.lockは編集しないように気をつけて下さい。
Pipfile.lock は、pipenv install 実行時に自動で更新されますが、--skip-lock オプション利用時など、手動での更新が必要になることがあります。
この場合は、pipenv lock を実行してください。
Pipenvを使って開発されたプロジェクトを受けとり、利用する側になった場合の話です。
基本的には、pipenv install コマンドで、Pipfileに記載されているパッケージを全てインストールできます。
(Pipfile.lockがある場合はそちらを使うため、より安全です。)
[email protected]:~/tmp$ git clone http://tuxedokatzen.local.local/tuxedokatze/pipenv-example.git
Cloning into 'pipenv-example'...
remote: Counting objects: 10, done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 10 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (10/10), done.
Checking connectivity... done.
[email protected]:~/tmp$ cd pipenv-example/
[email protected]:~/tmp/pipenv-example$ ls
hello Pipfile Pipfile.lock README.md
[email protected]:~/tmp/pipenv-example$ pipenv install
Creating a virtualenv for this project…
Using /usr/bin/python3.5m to create virtualenv…
⠋Running virtualenv with interpreter /usr/bin/python3.5m
Using base prefix '/usr'
New python executable in /home/tabby/.local/share/virtualenvs/pipenv-example-PopIJ_6O/bin/python3.5m
Also creating executable in /home/tabby/.local/share/virtualenvs/pipenv-example-PopIJ_6O/bin/python
Installing setuptools, pip, wheel...done.
Virtualenv location: /home/tabby/.local/share/virtualenvs/pipenv-example-PopIJ_6O
Installing dependencies from Pipfile.lock (c43f0d)…
🐍 ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 15/15 — 00:00:16
To activate this project's virtualenv, run the following:
$ pipenv shell
[email protected]:~/tmp/pipenv-example$ pipenv shell
Spawning environment shell (/bin/bash). Use 'exit' to leave.
. /home/tabby/.local/share/virtualenvs/pipenv-example-PopIJ_6O/bin/activate
[email protected]:~/tmp/pipenv-example$ . /home/tabby/.local/share/virtualenvs/pipenv-example-PopIJ_6O/bin/activate
(pipenv-example-PopIJ_6O) [email protected]:~/tmp/pipenv-example$ cd hello/
(pipenv-example-PopIJ_6O) [email protected]:~/tmp/pipenv-example/hello$ python tf_eager_linear_regression.py
WARNING:tensorflow:From /home/tabby/.local/share/virtualenvs/pipenv-example-PopIJ_6O/lib/python3.5/site-packages/tensorflow/contrib/learn/python/learn/datasets/base.py:198: retry
(from tensorflow.contrib.learn.python.learn.datasets.base) is deprecated and will be removed in a future version.
Instructions for updating:
Use the retry module or similar alternatives.
True w: [[-2.0], [4.0], [1.0]]
True b: [0.5]
2018-04-04 14:48:18.097783: I tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2018-04-04 14:48:19.081736: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1344] Found device 0 with properties:
name: TITAN Xp major: 6 minor: 1 memoryClockRate(GHz): 1.582
pciBusID: 0000:03:00.0
totalMemory: 11.91GiB freeMemory: 11.74GiB
2018-04-04 14:48:19.081777: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1423] Adding visible gpu devices: 0
2018-04-04 14:48:19.382287: I tensorflow/core/common_runtime/gpu/gpu_device.cc:911] Device interconnect StreamExecutor with strength 1 edge matrix:
2018-04-04 14:48:19.382332: I tensorflow/core/common_runtime/gpu/gpu_device.cc:917] 0
2018-04-04 14:48:19.382344: I tensorflow/core/common_runtime/gpu/gpu_device.cc:930] 0: N
2018-04-04 14:48:19.382701: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1041] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 11372 MB memory) -> physical GPU (device: 0, name: TITAN Xp, pci bus id: 0000:03:00.0, compute capability: 6.1)
Using device: gpu:0
Iteration 0: loss = 25.42492
Iteration 1: loss = 11.673475
Iteration 2: loss = 8.603049
Iteration 3: loss = 5.4580593
Iteration 4: loss = 4.097969
Iteration 5: loss = 2.6541495
Iteration 6: loss = 1.5134283
Iteration 7: loss = 1.0506675
Iteration 8: loss = 0.8213163
Iteration 9: loss = 0.45869213
Iteration 10: loss = 0.23038542
Iteration 11: loss = 0.12165615
Iteration 12: loss = 0.08025699
Iteration 13: loss = 0.036460727
Iteration 14: loss = 0.026943287
Iteration 15: loss = 0.01902075
Iteration 16: loss = 0.009861258
Iteration 17: loss = 0.008516684
Iteration 18: loss = 0.004945925
Iteration 19: loss = 0.004486588
After training: w = [[-1.9802108 ]
[ 3.9563005 ]
[ 0.98675597]]
After training: b = [0.5007343]