それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

今どきは、pipenv らしいので pipenv で環境構築に使ってみることにした

python のパッケージ周りの進化(?)

  • setup.py
  • pip
  • pyenv
  • virtualenv
  • direnv
  • requirements.txt
  • pipenv ← now

そういえば、古くは - egg / easy_install とかありましたね。

pipenv を一言でいうと

今どきな「パッケージ管理」に対応してるのが pipevn コマンドらしい。

これを使うと。

  • php composer
  • ruby bundler
  • npm / yarn

的な、プロジェクト単位のパッケージ管理。ですね。アップデートとかも含めて"pipenv"で事足りる様になるようだ。。

これ読むとわかる。

Pythonのパッケージ周りのベストプラクティスを理解する - エムスリーテックブログ

requirements.txt

次に、インストールしたパッケージ群を、正確にもう一度インストールし直す方法が問題になりました。

venv (virtualenv)

さて、パッケージをインストールできるようになりましたが、 別のプロジェクトで使うパッケージが混ざってしまう問題が起きました。

pyenv

次に、複数のPython自体をビルドするのが大変という問題が起きました。

pipenvその2

次に開発環境を作る手順が面倒という問題が起きました。

使ってみる。

まず、pipenv コマンドをglobalなpipでインストール

pip install pipenv

pipenv 環境を作る

最初にプロジェクトのディレクトリを作る

mkdir sample 
cd sample

pipenv インストール環境の初期化

プロジェクトのディレクトリ内でpipenv install をすると環境が作られる。

pipenv install 

もし、python のバージョンを指定したいときは、次のようにする。

pipenv install --python=3.7

Pipfile と .lock が作られる。

takuya@sample$ ll
total 12K
-rw-r--r-- 1 takuya staff 138 2019-04-14 18:35 Pipfile
-rw-r--r-- 1 takuya staff 453 2019-04-14 18:35 Pipfile.lock

venv 環境に入る

pipenv で準備は終わってるので

よくある、venv 環境を使うパターン

$ pipenv shell 
(sample) $ 
(sample) $  deactivate
$

直接 activate を source することでも可能。

source  $(pipenv --venv)/bin/activate

venv 環境を使う2

pipenv shell でもいいんだけど、pyenv 的な使い方もできる

takuya@sample $ pipenv run python -V
Python 3.7.2

プロジェクトでpipを使いたいときは

takuya@dojin$ pipenv run pip -V
pip 19.0.3 from /Users/takuya/Desktop/sample/.venv/lib/python3.7/site-packages/pip (python 3.7)

いい感じにvenv を確保してくれてるのがわかる。

パッケージのインストールとアンインストール

pipenv install requests
pipenv uninstall requests

ただ、これをやっても、プロジェクトのフォルダにファイルがコピーされて生成されるわけではなかった。

どこにインストされたか詳細を見るには

pipenv install requests --verbose

ここを見る限り、/Users/takuya/.local/share/virtualenvs/sample-8HuA3Lk0/bin/pip にvenv が作られていた。

具体的にvenv がどこに作られているのか知りたいときは

pipenv --venv

とすれば、venv の場所が表示されます。

開発用パッケージのインストール

pipenv install --dev ipython

--dev をつけるのはよく見るパターンですね。

npm run 的なアレ

Pipfile に scripts を書けば、npm run 的なアレができる。

[scripts]
echo = 'echo Hello world'

実行

takuya@sample $ pipenv run echo
Hello world

プロジェクト内にvenv 環境を作りたいんだけど

npm の node_module や composer vendor/ のようにしたいときは、

export PIPENV_VENV_IN_PROJECT=1
pipenv 

面倒なときは次のようにalias か?

alias pipenv='PIPENV_VENV_IN_PROJECT=1 pipenv'

alias で十分ですね。

$ alias pipenv='PIPENV_VENV_IN_PROJECT=1 pipenv'
$ pipenv --venv

/Users/takuya/Desktop/sample/.venv

pipenv のシェル補完がしたい

bash completion が欲しい人は

これを書くだけ。

eval "$(pipenv --completion)"

ただし、実行時間に注意(i5 Macbook 2018 で 500ms ) 。 bashrc に書くとシェル起動がすこし遅くなるので注意。

追記

PIL をなんとなく、pipenvでインストールしてエラ−になった。 よく考えたら、PILはpypthon3 はもう無いのに。 pipenv.exceptions.ResolutionFailure が出まくる。

pipenv.exceptions.ResolutionFailure
ERROR: ERROR: Could not find a version that matches pil

このあと、pipenv install がすべてエラーになってしまった。macos など環境依存でライブラリが足りずにインストールに失敗したあと、lock ファイルが汚くなることがあるようです。

こういうときは、とりあえずlock ファイル消して、Pipfile を書き直したらきれいになるようです。

インストール失敗しても失敗したpipfile のママ残りました。インストール成功してから pipfile を更新してほしいですよね。

参考資料

必読 → https://pipenv-ja.readthedocs.io/ja/translate-ja/advanced.html#configuration-with-environment-variables

公式→ https://pipenv.readthedocs.io/en/latest/

日本語→ https://pipenv-ja.readthedocs.io/ja/translate-ja/install.html

Pipenvを使ったPython開発まとめ - Qiita

https://github.com/pypa/pipenv/issues/259