それマグで!

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

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

pipenvを使う。pyenv+venvもいいけど、いまどきな'pipenv' で環境構築に使って使い勝手を調べてみた.

目次

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

python はパッケージ管理がガラッと変わることが多い。

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

そういえば、古くは - egg / easy_install とかありましたね。 機能追加じゃなくて、以前の機能をつかって新しいコマンドとして作られるんだけど、個人的には、同じコマンドが進化してくれればいいのにと思ったりする。

pipenv を一言でいうと

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

これを使うと。

他言語のパッケージ管理に使い勝手が近くなると思われる。

  • php composer
  • ruby bundler
  • npm / yarn

この的な、プロジェクト単位のパッケージ管理と同等になるんですね。アップデートとかも含めて"pipenv"で事足りる様になるようだ。だとしたらすごく便利だよね。

pipenv を使うことで venv や pyenv を併せたようなことが できるようになって便利だよね。

すぐわかるpipenvの使い方。

pip install pipenv 
mkdir myProjcet
cd myProjcet
pipenv install 

pipenv についてはこれ読むとわかる。

この記事が詳しい。

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

requirements.txt

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

venv (virtualenv)

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

pyenv

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

pipenvその2

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

というわけで、requirements.txt の問題点とpyenvも問題点を片付けたのがpipenv という位置づけのようですね。

pipenvを使ってみる。

まず、pipenv コマンドをインストールします。

コマンドは、グローバル環境で使うので

pyenv な globalなpipでインストール

pip install pipenv

プロジェクト単位のpython環境のフォルダを作るためのコマンドを自分のシステム環境に導入するので、global 環境に用意します。

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 的なアレ

pipenvでもnpm run 的なことが出来る。

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

[scripts]
echo = 'echo Hello world'

実行

takuya@sample $ pipenv run echo
Hello world

手作業でpipenv は編集しなくていい。pipenv install

ついつい、 pip install を叩きそうになるのを我慢。

pipenv install speedtest-cli

これでPipfile が更新されます。

github でバージョン管理するときに、Pipfileを対象にして環境をデプロイ先で再現するときに大事。

プロジェクト内に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_VENV_IN_PROJECTの注意(2019-08-21)追加

/home/takuya/Pipfile のようにすでに上位ディレクトリにPIpfile があると、そっちが優先されてディレクトリ単位に作られないので注意が必要

ll /home/takuya/Pipfile
cd /home/takuya/myproject/
pipenv install 

Pipfile が上位ディレクトリに存在すると、venv 環境下になるので、うっかり $HOME などにPipfile を作らないように注意すること。

うっかり pipenv しちゃったときは、即座に消しておかないと混乱します。

pipenv のシェル補完がしたい

bash completion が欲しい人は

これを書くだけ。

eval "$(pipenv --completion)"

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

git clone した python プロジェクトをpipenv する。

git clone した プロジェクトがpython プロジェクトで pip インストールが必要な場合。

pipenv を使うと次のようになります。

git clone $URL
cd $procject
export PIPENV_VENV_IN_PROJECT=1
pipenv install 
pipenv run pip -r requirements.txt

export PIPENV_VENV_IN_PROJECT=1 はお好みで。

追記

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 を更新してほしいですよね。

2019-10-29

Googleのpipenv で検索にヒットしないので、ほんとうにGoogle検索どうなってんだろう

2019/10/30更新

pipenv で google の検索インデックスに入らないので、記事を一部書き直した。

2019-12-17

PIPENV_VENV_IN_PROJECT でまた混乱したので、追記・改変

参考資料

必読 → 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