Skip to content

Instantly share code, notes, and snippets.

@tuxedocat
Last active June 11, 2018 02:27
Show Gist options
  • Save tuxedocat/2041aa910c8cb0fff80e45124bc44e0c to your computer and use it in GitHub Desktop.
Save tuxedocat/2041aa910c8cb0fff80e45124bc44e0c to your computer and use it in GitHub Desktop.
pipenvの紹介。

pipenv を使ったPythonプロジェクトのパッケージ管理

まとめ

ひとことでいえば…

アプリ開発時には、なるべく pipenv を使おう!

  • これまでのPythonパッケージ管理方法の問題

    • まともに依存関係を扱えるパッケージマネージャーが存在しなかった。
      • pip はそこまで扱わない。
    • 複雑なビルドが必要なパッケージの、安定した配布方法が無かった。
    • どちらも、conda により解決するかと思われたが…
      • コミュニティは大きいものの、PyPA標準ではない。
      • そもそも目的が異なる。
  • 最近は、Anacondaの利点は薄れつつある1

    • pipでも各環境向けのバイナリパッケージ(wheel)が用意されていることが多い。
    • Anacondaはパッケージ一式が巨大。
    • じゃあMinicondaなら…といっても、結局condaパッケージマネージャの使い方を覚える必要がある。
    • conda には無いパッケージの場合は pip を併用することになるが…
      • バージョンの競合が生じやすい。
    • Anaconda利用時は、いくつかのコマンドが置き換えられるため、思いもよらぬ副作用が生じる2
  • 最近のPythonのパッケージ管理

    • The Python Packaging Authority (PyPA) による標準化が進んでいる。
    • これまでの問題は、ほぼ解消してきている。
      • プロジェクト単位のパッケージ管理3: ⭐ pipenv
      • ビルド済みパッケージの配布: Python Wheels

なるべくPythonコミュニティ内で標準的に使われる方法でやろう!

pipenvを使えばできること

  • 依存関係を考慮したパッケージ管理
  • プロジェクト単位の仮想環境 (virtualenv) の管理
  • 依存関係を記録し、他のユーザーの環境で再現すること

pipenvではできないこと

  • 複数のバージョンのPythonインタプリタの自動セットアップ
    • システムのパッケージマネージャーや、condapyenv の担当です。
    • pyenvとの連携は可能なので、必要に応じて組み合わせてください。
  • 複数のユーザーの共用環境の構築
    • できなくはないが、そういう目的のものではない。

pipenvの使い方(簡易版)

0. 準備: pipenv コマンドのセットアップ

もし、pipenv コマンドがない、と表示された場合は、以下のコマンドでセットアップしてください。

# ~/.local/bin/pipenv としてインストールされます。
$ pip3 install pipenv

1. プロジェクトの作成と初期設定

プロジェクトのディレクトリ内で、プロジェクト用の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に依存パッケージは記録されているので、復元は容易です。)

Tips: システム以外のPython処理系の利用

環境によっては、必要な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

2. 必要なパッケージのインストール

Pipenvを用いたプロジェクトの場合は、pipenv install <packagename> コマンドでパッケージをインストールします。

たとえば、このリポジトリのサンプルコードでは、Eager execution mode が利用可能な TensorFlowが必要です。
この場合は、以下のようにしてインストールできます。

$ pipenv install tensorflow-gpu==1.7.0

pipenv によってインストールされたパッケージは、Pipfileに記録されます。

[packages]
tensorflow-gpu = "==1.7.0"

もちろん、バージョン指定が必要ない場合は、省略しても大丈夫です。
その場合のPipfileは以下のようになります。

$ pipenv install tensorflow-gpu
[packages]
tensorflow-gpu = "*"

Tips: 開発時に必要なパッケージの管理

配布時には必要ないが、開発時には必要なパッケージ、というものもあるかもしれません。
テスト用ライブラリ (nose, pytest,...) や各種のツール (ipython, bpython, autopep8, ...) のように、開発時に、チーム内でバージョンを固定したいものがある場合は、以下のコマンドを使います。

$ pipenv install --dev <package-name>

このコマンドでインストールされたパッケージは、Pipfile内の [dev-packages] に記録されます。
以下はその一例です。

[dev-packages]
yapf = "*"
pytest = "*"
bpython = "*"

Tips: その他

ここまでは、pipenv install コマンドで、パッケージを逐一インストールしてきましたが、
Pipfileの書式に則っていれば、Pipfileを直接編集することも可能です。

そうやって作ったPipfileからのインストールは、Pipfileがあるディレクトリ内で、pipenv install を実行すればOKです。

3. 開発時

開発時には、シェルからプログラムを実行したり、各種のIDEやエディタからプロジェクト用の仮想環境を利用したりするはずです。

プロジェクト用の仮想環境を有効にするには、 pipenv shell コマンドを使います。

$ pipenv shell

# このように環境名が表示されるはず…
(pipenv-example-uaXO-agg) $ 

# プロジェクト用の環境から抜けるとき
(pipenv-example-uaXO-agg) $ exit

エディタやIDEからの利用時には、プロジェクト用の仮想環境の実体のPATHを指定する必要があるかもしれません。
プロジェクト用の仮想環境の実体を確認するには、pipenv --pypipenv --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-

Tips: 各種IDE・エディタの対応状況

現状、Pipenvで作成したプロジェクト用の仮想環境を、自動的に見つけてくれるものは少ないです。
http://pipenv-ja.readthedocs.io/ja/translate-ja/advanced.html#community-integrations

ただし、上記のように、実体は virtualenv なので、そのディレクトリやパスを指定すれば、多くの場合問題ありません。

4. 公開・配布するとき

プロジェクトを公開・配布するときには、PipfilePipfile.lock も忘れずに含めてください。

Pipfile.lock は必須ではありませんが、なるべく含めてください。
というのは、このファイルには、各種パッケージのハッシュ値とバージョンが厳密に記録されているため、開発者と全く同じ環境を再現するために必要になることが多いです。

Pipfileは手動で編集しても大丈夫ですが、Pipfile.lockは編集しないように気をつけて下さい。

Tips: Pipfile.lock の手動更新

Pipfile.lock は、pipenv install 実行時に自動で更新されますが、--skip-lock オプション利用時など、手動での更新が必要になることがあります。
この場合は、pipenv lock を実行してください。

5. アプリを利用する側になった場合

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]

Footnotes

  1. それでも導入したのは、各種ML関連パッケージやR共用環境の整備に対してはシンプルで適切だったから。

  2. 仮想環境を有効化すると、xzやzlibなどのコマンドがCondaの仮想環境のほうのものに置き換られてしまう。

  3. 以前から、Pythonアプリ開発時の依存ライブラリ管理には、virtualenv (venv) が推奨されていた。

  4. Pipfileは、TOMLという形式のマークアップ言語で記述されています。

[[source]]
name = "pypi"
verify_ssl = true
url = "https://pypi.python.org/simple"
[dev-packages]
yapf = "*"
pytest = "*"
bpython = "*"
[requires]
python_version = "3.5"
[packages]
tensorflow-gpu = "==1.7.0"
{
"_meta": {
"hash": {
"sha256": "633195a72ff910ec638457a965ab529f93d96b2988db683a0d2316a7d3c43f0d"
},
"pipfile-spec": 6,
"requires": {
"python_version": "3.5"
},
"sources": [
{
"name": "pypi",
"url": "https://pypi.python.org/simple",
"verify_ssl": true
}
]
},
"default": {
"absl-py": {
"hashes": [
"sha256:d160f7dc39f2f05ddc0bbf3a7bea4cc659fedc45fd9042e87346b24fe1cd00bb"
],
"version": "==0.1.13"
},
"astor": {
"hashes": [
"sha256:64c805f1ad6fbc505633416b6174fc23796eb164f371a7dc1f3951ea30560fb5",
"sha256:ff6d2e2962d834acb125cc4dcc80c54a8c17c253f4cc9d9c43b5102a560bb75d"
],
"version": "==0.6.2"
},
"bleach": {
"hashes": [
"sha256:978e758599b54cd3caa2e160d74102879b230ea8dc93871d0783721eef58bc65",
"sha256:e67f46adcec78dbc3c04462f3aba3213a673d5652eba2609ed1ef15492a44b8d"
],
"version": "==1.5.0"
},
"gast": {
"hashes": [
"sha256:7068908321ecd2774f145193c4b34a11305bd104b4551b09273dfd1d6a374930"
],
"version": "==0.2.0"
},
"grpcio": {
"hashes": [
"sha256:022dc2a6d1537a5a16af4ccc3355ad7b512f9c627a1d5d579cd7c18830378bb3",
"sha256:025a591606b0aca13bec3e019d6acec01a39421f01b915b98a3a93ea0a53b412",
"sha256:03265472d39bf26f124c3ef68446f7873c8260893e6ae65b323a5b51ed52e580",
"sha256:10efe2e016c3ca7a370771ffcf1de9baa3456d4bccefde0f4ce3be091d871c8f",
"sha256:14bca481188c3f19135012aaff9abefa4e15529c7e1aca3084183d78094d06bd",
"sha256:17240d672b5c1c9ff22e52236c1870413b7fb5af762b97ce5a747a55e0a57e98",
"sha256:1bc36e512741f82c1d73f42df536aa2ab75d840f0d35c149b5d0bee1aed16862",
"sha256:224c513fbe0c3ca546870e5c21b08a8a56cd25795b76b3192ee9702a3344764b",
"sha256:2894466c499d9752e0d49ee8adc5ee12c676d86211fc1b292bf713cc7cfe9853",
"sha256:435b3bab2e34814666854eec203c77b169df1cd56cf22fe449cf5510af416e7d",
"sha256:4765600467d7cdb8f62a591d4427ddbeefcf4dbbe46e2f1b10af555e815ecbcb",
"sha256:4fa658a7e1ba5727ca066b1c8bb64c6befb98f2b8007f04a16c7c84555bf11b9",
"sha256:87e52924a99ac5935a468b3fe49c4b0090bd9b05470b55ed1192308791e6d332",
"sha256:88afda198adb0a9da52a66152062027a57877b46f59ffcf55acc3cbfaff77160",
"sha256:982439a872d41f969724efc139e0416ba45e0d7446e9a41fd2ebe19351adff9a",
"sha256:a1bc37c9910d0fbf4d9e80d5822f92c6e01e28dd1eb01323636ed19666b537cb",
"sha256:aa473b8276de39eeccc4ad6cbb7fd7feab0868180d72c0c93226033c79fa69b7",
"sha256:ae82bf2f7ceac6ba956e816120b4f66bda035571350e46b61bbdde1808aed1dd",
"sha256:b56e4f355c2499bb0bf8f8f4d0362b618b06afdfd2c10722710596dc7e295c6c",
"sha256:d2accc8e354f0ed5b337865260a78b3c6851d2fe3c0e1b025d437122cc15dd31",
"sha256:d410835e7554d064c2d99cfa0dd393ffbb0ccf52145ab51c725a8472ed254a3c",
"sha256:d9e3105f6de6cb759b028702bdd21cb36d27e010227669e43c675b9957a3c180",
"sha256:da306c80d69801a3e4115c448ed4ad481957d723ec1e00b99497c6661573c3e5",
"sha256:e579e4124d2a0931ce39639c60e0711918d6659b933eb97e67f60f84666ea488",
"sha256:e86639989c03831912fd9924beda26f6e9ffcc267656cea035bde9d88cf793b2",
"sha256:ea9564f58144e2f07995d57fb8e636be5efb084cd59c8651391ada2bb75dc0ff",
"sha256:f4a38071dd27f140cfe774f56aecdf0e33de926c21289cc9c7521ce8dd91fc1c"
],
"version": "==1.10.0"
},
"html5lib": {
"hashes": [
"sha256:2612a191a8d5842bfa057e41ba50bbb9dcb722419d2408c78cff4758d0754868"
],
"version": "==0.9999999"
},
"markdown": {
"hashes": [
"sha256:9ba587db9daee7ec761cfc656272be6aabe2ed300fece21208e4aab2e457bc8f",
"sha256:a856869c7ff079ad84a3e19cd87a64998350c2b94e9e08e44270faef33400f81"
],
"version": "==2.6.11"
},
"numpy": {
"hashes": [
"sha256:0739146eaf4985962f07c62f7133aca89f3a600faac891ce6c7f3a1e2afe5272",
"sha256:07e21f14490324cc1160db101e9b6c1233c33985af4cb1d301dd02650fea1d7f",
"sha256:0f6a5ed0cd7ab1da11f5c07a8ecada73fc55a70ef7bb6311a4109891341d7277",
"sha256:0fd65cbbfdbf76bbf80c445d923b3accefea0fe2c2082049e0ce947c81fe1d3f",
"sha256:20cac3123d791e4bf8482a580d98d6b5969ba348b9d5364df791ba3a666b660d",
"sha256:528ce59ded2008f9e8543e0146acb3a98a9890da00adf8904b1e18c82099418b",
"sha256:56e392b7c738bd70e6f46cf48c8194d3d1dd4c5a59fae4b30c58bb6ef86e5233",
"sha256:675e0f23967ce71067d12b6944add505d5f0a251f819cfb44bdf8ee7072c090d",
"sha256:6be6b0ca705321c178c9858e5ad5611af664bbdfae1df1541f938a840a103888",
"sha256:719d914f564f35cce4dc103808f8297c807c9f0297ac183ed81ae8b5650e698e",
"sha256:768e777cc1ffdbf97c507f65975c8686ebafe0f3dc8925d02ac117acc4669ce9",
"sha256:7f76d406c6b998d6410198dcb82688dcdaec7d846aa87e263ccf52efdcfeba30",
"sha256:8c18ee4dddd5c6a811930c0a7c7947bf16387da3b394725f6063f1366311187d",
"sha256:99051e03b445117b26028623f1a487112ddf61a09a27e2d25e6bc07d37d94f25",
"sha256:a1413d06abfa942ca0553bf3bccaff5fdb36d55b84f2248e36228db871147dab",
"sha256:a7157c9ac6bddd2908c35ef099e4b643bc0e0ebb4d653deb54891d29258dd329",
"sha256:a958bf9d4834c72dee4f91a0476e7837b8a2966dc6fcfc42c421405f98d0da51",
"sha256:bb370120de6d26004358611441e07acda26840e41dfedc259d7f8cc613f96495",
"sha256:d0928076d9bd8a98de44e79b1abe50c1456e7abbb40af7ef58092086f1a6c729",
"sha256:d858423f5ed444d494b15c4cc90a206e1b8c31354c781ac7584da0d21c09c1c3",
"sha256:e6120d63b50e2248219f53302af7ec6fa2a42ed1f37e9cda2c76dbaca65036a7",
"sha256:f2b1378b63bdb581d5d7af2ec0373c8d40d651941d283a2afd7fc71184b3f570",
"sha256:facc6f925c3099ac01a1f03758100772560a0b020fb9d70f210404be08006bcb"
],
"version": "==1.14.2"
},
"protobuf": {
"hashes": [
"sha256:01ccd6d03449ae75b779fb5bf4ed62177d61afe3c5e6465ccf3f8b2e1a84afbe",
"sha256:1d92cc30b0b46cced33adde5853d920179eb5ea8eecdee9552502a7f29cc3f21",
"sha256:242e4c7ae565267a8bc8b92d707177f915607ea4bd73244bec6cbf4a49b96661",
"sha256:3b60685732bd0cbdc802dfcb6071efbcf5d927ce3127c13c33ea1a8efae3aa76",
"sha256:3f655e1f99c3e14d56ca900af1b9a4715b691319a295cc38939d7f77eabd5e7c",
"sha256:560a38e692a69957a70ba0e5839aa67430efd63072bf91b0539dac19055694cd",
"sha256:5c1c8f6a0a68a874e3beff89255959dd80fad45870e96c88944a1b81a22dd5f5",
"sha256:628a3bf0794a8b3cabb18db11eb67cc10e0cc6e5525d557ae7b682bb73fa2018",
"sha256:7222d6616108b33ad6cbeff8117062a73c43cdc8fa8f64f6a322ebeb663e710e",
"sha256:76ef6ca3c50e4cfd044861586d5f1b352e0fe7f17f883df6c165bad5b4d0e10a",
"sha256:7c193e6964e752bd056735594826c5b03274ceb8f07349d3ae47d9766250ba96",
"sha256:869e12bcfb5759e683f53ec1dd6155b7be034065431da289f0cb4510040a0799",
"sha256:905414e5ea6cdb78d8730f66335755152b46685fcb9fc2f2134024e3ea9e8dcc",
"sha256:ac0067e3c60737865ed72bb7416e02297d229d960902802d874c0e167128c809",
"sha256:adf716a89c9cc1891ead79a861c427071ef59172f0e11967b00565a9547b3bd0",
"sha256:bcfa99f5a82f5eaaf6e5cee5bfdca5a1670f5740aec1d93dae170645ed1a16b0",
"sha256:cc94079ae6cbcea5ae194464a30f3223f075e06a0446f52bca9ddbeb6e9f412a",
"sha256:d5d9edfdc5a3a01d06062d677b121081629782edf0e05ca1be14f15bb947eeee",
"sha256:e269ab7a50bf0fa6fe6a88ea7dcc7a1079ae9450d9ab9b7730ac32916d55508b",
"sha256:e7fd33a3474cbe18fd5b5620784a0fa21fcae3e402b1806e29c6b450c7f61706"
],
"version": "==3.5.2.post1"
},
"six": {
"hashes": [
"sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9",
"sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb"
],
"version": "==1.11.0"
},
"tensorboard": {
"hashes": [
"sha256:4c4793f904d2e8f5b83fc05ae3330e48c8305f08a3250019a6f44e37681644a9",
"sha256:f3a873d87eb1558836e2a4f0cda3003e93824345ab3f22aba4770ac1b79f8ded"
],
"version": "==1.7.0"
},
"tensorflow-gpu": {
"hashes": [
"sha256:36125edbd9af670e04b47838529635fd9298ead9062a241b7835a86136e2cb72",
"sha256:496eb9a9b570fb51f215e57e1cf146dbc9095185f1108389d34e1c924ac70171",
"sha256:6a5ded63e7a77961168bf90f08ec6ee6cc8a82d1ef75cb71195acb222f97ba9e",
"sha256:92375dad3e5b4f3b5e03a1282aa5f2424768b020c5ff6b0ffee783751fdf4d5f",
"sha256:9cd4f199b800e08e5252b9ba3686ee970532a28cdbaf84168e5ec30d93263dc8",
"sha256:bcca39f839c03e867b95eb23fcbcc06c70a081a56787a8144709912f5bf1853e",
"sha256:f36dacd6062b4508c61840fec8c53b77c06558c96f13b81ae55adc19a82baf7a"
],
"index": "pypi",
"version": "==1.7.0"
},
"termcolor": {
"hashes": [
"sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"
],
"version": "==1.1.0"
},
"werkzeug": {
"hashes": [
"sha256:c3fd7a7d41976d9f44db327260e263132466836cef6f91512889ed60ad26557c",
"sha256:d5da73735293558eb1651ee2fddc4d0dedcfa06538b8813a2e20011583c9e49b"
],
"version": "==0.14.1"
},
"wheel": {
"hashes": [
"sha256:1ae8153bed701cb062913b72429bcf854ba824f973735427681882a688cb55ce",
"sha256:9cdc8ab2cc9c3c2e2727a4b67c22881dbb0e1c503d592992594c5e131c867107"
],
"markers": "python_version >= '3'",
"version": "==0.31.0"
}
},
"develop": {
"attrs": {
"hashes": [
"sha256:1c7960ccfd6a005cd9f7ba884e6316b5e430a3f1a6c37c5f87d8b43f83b54ec9",
"sha256:a17a9573a6f475c99b551c0e0a812707ddda1ec9653bed04c13841404ed6f450"
],
"version": "==17.4.0"
},
"blessings": {
"hashes": [
"sha256:26dbaf2f89c3e6dee11c10f7c0b85756ed75cf602b1bb7935b4efd8ed67a000f",
"sha256:466e43ff45723b272311de0437649df464b33b4daba7a54c69493212958e19c7",
"sha256:74919575885552e14bc24a68f8b539690bd1b5629180faa830b1a25b8c7fb6ea"
],
"version": "==1.6.1"
},
"bpython": {
"hashes": [
"sha256:6cd1b165888c232f2fcdd4313577b6066155d6c94b3d42c0f11649c000394417",
"sha256:8907c510bca3c4d9bc0a157279bdc5e3b739cc68c0f247167279b6fe4becb02f"
],
"index": "pypi",
"version": "==0.17.1"
},
"certifi": {
"hashes": [
"sha256:14131608ad2fd56836d33a71ee60fa1c82bc9d2c8d98b7bdbc631fe1b3cd1296",
"sha256:edbc3f203427eef571f79a7692bb160a2b0f7ccaa31953e99bd17e307cf63f7d"
],
"version": "==2018.1.18"
},
"chardet": {
"hashes": [
"sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae",
"sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"
],
"version": "==3.0.4"
},
"curtsies": {
"hashes": [
"sha256:89c802ec051d01dec6fc983e9856a3706e4ea8265d2940b1f6d504a9e26ed3a9"
],
"version": "==0.3.0"
},
"greenlet": {
"hashes": [
"sha256:09ef2636ea35782364c830f07127d6c7a70542b178268714a9a9ba16318e7e8b",
"sha256:0fef83d43bf87a5196c91e73cb9772f945a4caaff91242766c5916d1dd1381e4",
"sha256:1b7df09c6598f5cfb40f843ade14ed1eb40596e75cd79b6fa2efc750ba01bb01",
"sha256:1fff21a2da5f9e03ddc5bd99131a6b8edf3d7f9d6bc29ba21784323d17806ed7",
"sha256:42118bf608e0288e35304b449a2d87e2ba77d1e373e8aa221ccdea073de026fa",
"sha256:50643fd6d54fd919f9a0a577c5f7b71f5d21f0959ab48767bd4bb73ae0839500",
"sha256:58798b5d30054bb4f6cf0f712f08e6092df23a718b69000786634a265e8911a9",
"sha256:5b49b3049697aeae17ef7bf21267e69972d9e04917658b4e788986ea5cc518e8",
"sha256:75c413551a436b462d5929255b6dc9c0c3c2b25cbeaee5271a56c7fda8ca49c0",
"sha256:769b740aeebd584cd59232be84fdcaf6270b8adc356596cdea5b2152c82caaac",
"sha256:ad2383d39f13534f3ca5c48fe1fc0975676846dc39c2cece78c0f1f9891418e0",
"sha256:b417bb7ff680d43e7bd7a13e2e08956fa6acb11fd432f74c97b7664f8bdb6ec1",
"sha256:b6ef0cabaf5a6ecb5ac122e689d25ba12433a90c7b067b12e5f28bdb7fb78254",
"sha256:c2de19c88bdb0366c976cc125dca1002ec1b346989d59524178adfd395e62421",
"sha256:c7b04a6dc74087b1598de8d713198de4718fa30ec6cbb84959b26426c198e041",
"sha256:f8f2a0ae8de0b49c7b5b2daca4f150fdd9c1173e854df2cce3b04123244f9f45",
"sha256:fcfadaf4bf68a27e5dc2f42cbb2f4b4ceea9f05d1d0b8f7787e640bed2801634"
],
"version": "==0.4.13"
},
"idna": {
"hashes": [
"sha256:2c6a5de3089009e3da7c5dde64a141dbc8551d5b7f6cf4ed7c2568d0cc520a8f",
"sha256:8c7309c718f94b3a625cb648ace320157ad16ff131ae0af362c9f21b80ef6ec4"
],
"version": "==2.6"
},
"more-itertools": {
"hashes": [
"sha256:0dd8f72eeab0d2c3bd489025bb2f6a1b8342f9b198f6fc37b52d15cfa4531fea",
"sha256:11a625025954c20145b37ff6309cd54e39ca94f72f6bb9576d1195db6fa2442e",
"sha256:c9ce7eccdcb901a2c75d326ea134e0886abfbea5f93e91cc95de9507c0816c44"
],
"version": "==4.1.0"
},
"pluggy": {
"hashes": [
"sha256:7f8ae7f5bdf75671a718d2daf0a64b7885f74510bcd98b1a0bb420eb9a9d0cff"
],
"version": "==0.6.0"
},
"py": {
"hashes": [
"sha256:29c9fab495d7528e80ba1e343b958684f4ace687327e6f789a94bf3d1915f881",
"sha256:983f77f3331356039fdd792e9220b7b8ee1aa6bd2b25f567a963ff1de5a64f6a"
],
"version": "==1.5.3"
},
"pygments": {
"hashes": [
"sha256:78f3f434bcc5d6ee09020f92ba487f95ba50f1e3ef83ae96b9d5ffa1bab25c5d",
"sha256:dbae1046def0efb574852fab9e90209b23f556367b5a320c0bcb871c77c3e8cc"
],
"version": "==2.2.0"
},
"pytest": {
"hashes": [
"sha256:6266f87ab64692112e5477eba395cfedda53b1933ccd29478e671e73b420c19c",
"sha256:fae491d1874f199537fd5872b5e1f0e74a009b979df9d53d1553fd03da1703e1"
],
"index": "pypi",
"version": "==3.5.0"
},
"requests": {
"hashes": [
"sha256:6a1b267aa90cac58ac3a765d067950e7dbbf75b1da07e895d1f594193a40a38b",
"sha256:9c443e7324ba5b85070c4a818ade28bfabedf16ea10206da1132edaa6dda237e"
],
"version": "==2.18.4"
},
"six": {
"hashes": [
"sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9",
"sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb"
],
"version": "==1.11.0"
},
"typing": {
"hashes": [
"sha256:3a887b021a77b292e151afb75323dea88a7bc1b3dfa92176cff8e44c8b68bddf",
"sha256:b2c689d54e1144bbcfd191b0832980a21c2dbcf7b5ff7a66248a60c90e951eb8",
"sha256:d400a9344254803a2368533e4533a4200d21eb7b6b729c173bc38201a74db3f2"
],
"version": "==3.6.4"
},
"urllib3": {
"hashes": [
"sha256:06330f386d6e4b195fbfc736b297f58c5a892e4440e54d294d7004e3a9bbea1b",
"sha256:cc44da8e1145637334317feebd728bd869a35285b93cbb4cca2577da7e62db4f"
],
"version": "==1.22"
},
"wcwidth": {
"hashes": [
"sha256:3df37372226d6e63e1b1e1eda15c594bca98a22d33a23832a90998faa96bc65e",
"sha256:f4ebe71925af7b40a864553f761ed559b43544f8f71746c2d756c7fe788ade7c"
],
"version": "==0.1.7"
},
"yapf": {
"hashes": [
"sha256:7d8ae3567f3fb2d288f127d35e4decb3348c96cd091001e02e818465da618f90",
"sha256:dd23b52edbb4c0461d0383050f7886175b0df9ab8fd0b67edd41f94e25770993"
],
"index": "pypi",
"version": "==0.21.0"
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment