LoginSignup
11
11

More than 5 years have passed since last update.

「pipenv + direnv」で脱「pyenv virtualenv + pyenv local」

Last updated at Posted at 2018-07-30

はじめに

最近話題の pipenv はいろいろと便利なところも多いのですが、単体だと pyenv local 相当のコマンドがありません。
毎回 pipenv run を頭につけるのは面倒だし、pipenv shell だと別の shell が立ち上がるからこれも面倒。

やっぱり、pyenv local みたいに cd したら勝手に環境が切り替わって欲しい。
そんな方は direnv を併用しましょう。

使用例

$ which python
/usr/bin/python

$ mkdir my_project

$ cd my_project

$ pipenv install --python=3.7 numpy matplotlib  # ≒ pyenv virtualenv 3.7.0 my_project
.....

$ echo 'layout_pipenv' > .envrc && direnv allow  # ≒ pyenv local my_project
direnv: loading .envrc
direnv: export +PIPENV_ACTIVE +VIRTUAL_ENV ~PATH

$ which python
/home/kzm4269/.local/share/virtualenvs/my_project-9qDNSaIH/bin/python

必要なもの

Python

Python 2.7 もしくは Python 3.4 以降ならなんでもいいです。

pipenv

普通に pip でインストールできます。aptbrew でもインストールできるようなのでお好みで。

pip install pipenv

詳しくは以下のURLを参照してください。

direnv

インストール方法は以下のURLを参照してください。
コンパイル済みのバイナリを使う方法とソースからコンパイルする方法があります。

補足1. pyenv が不要になるわけではありません

pipenv はあくまでも実行環境の構築が主な機能で、Python本体のインストールは管轄外です。
pyenv をインストールしておくと、 pipenv が裏で連携して Python 本体のインストールもしてくれるようになります。

補足2. 複数のディレクトリで virtualenv を共有するのは面倒になります

完全に別の場所にあるディレクトリどうしで同じ virtualenv を共有するのは「pipenv + direnv」だと難しいです。
pipenv なら pipenv local で同じ virtualenv を指定するだけなので楽なんですが...。
以下の例のように、片方のプロジェクトの virtualenv のディレクトリに、もう片方のそれへのシンボリックリンクを貼れば一応同じ環境で動かせますが、お行儀の良い使い方ではないと思います。

$ mkdir my_project1 my_project2
$ cd my_project1
$ pipenv install
$ ln -s $(pipenv --venv) ../my_project2/.venv

おわりに

pipenv を使うと実行環境の構築が pipenv install 一発で済んで非常に便利です。
依存パッケージの一括アップデートも pipenv update でできます。感動的。
他の人に同じ環境を用意してほしいときは PipfilePipfile.lock を渡すだけです。楽です。
pyenv もインストールしておくと、pipenv install するときにPython 本体のインストールもよしなにやってくれます。
「でも pyenv local みたいなのできないんでしょ?」って方は direnv をインストールしましょう。できるようになります。

それでは、良いPythonライフを。

11
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11