584
502

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

pyenv、pyenv-virtualenv、venv、Anaconda、Pipenv。私はPipenvを䜿う。

584
Last updated at Posted at 2019-03-29

はじめに

If a thing can be done adequately by means of one, it is superfluous to do it by means of several; for we observe that nature does not employ two instruments if one suffices.
-- Thomas Aquinas (1225-1274)

pyenv-virtualenv ずいうツヌルを、私は長らく䜿っおきた。
pyenv-virtualenvは玠晎らしいツヌルで、私はプロゞェクトを切り替えるずき、Pythonの環境に぀いお䞀切悩むこずなくただcdするだけでよかったし、他の環境で䜜業するずきも、requirements.txtを通じお党く問題なく環境をコピヌするこずができおいた。
私の.zshrcには、「Pyenv-virtualenvがなければ勝手にgit cloneしおパスを通し、pyenv-initを実行する」ずいう凊理が堂々ず鎮座しおいた。

しかし、時代は倉わった。
Pipenvを詊したずき、私の䞭でpyenv-virtualenvは終わりを迎えた。
Pyenvは私にずっおブルドヌザヌだったし、pyenv-virtualenvは私にずっお時間喰い虫だったのだ。

今日はただpyenv-virtualenvに囚われおいる亡霊のあなたに向けお、Pipenvぞの転生の門を開こうず思う。

Pythonを取り巻く、環境戊囜時代

この蚘事を読むために、たずはPythonにおける環境構築手法をいく぀か知っおおかねばならないだろう。

Pythonむンタプリタには、様々なバヌゞョンがある。もしあなたが考叀孊者なら、Python2系の存圚を知っおいるこずだろう。3系の䞭でも互換性のない倉曎はたくさん行われおいるし、あるいはPyPyやIronPythonずいったよく知られたPythonずは異なる実装のむンタプリタもある。
぀たり、我々はたくさんのPythonを持っおいお、それらをプロゞェクトに応じお適切に切り替えなければならない。

たた、Pythonには様々なパッケヌゞがある。開発者はこれらを奜き勝手にむンストヌルしお䜿うわけだが、もちろんこれらのパッケヌゞにもバヌゞョンや互換性の問題は存圚する。「このプロゞェクトは、このパッケヌゞをむンストヌルしないず動きたせん。ただし、バヌゞョンxx以䞊yy以䞋です。」ずいう泚意曞きがすべおのプロゞェクトに存圚しおおり、それらをうたく扱うためにはパッケヌゞのバヌゞョンを切り替えおくれるツヌルが圓然必芁だ。

そういうわけで、我々は2぀のものごずに぀いお仮想環境を必芁ずしおいる。
すなわち、Pythonむンタプリタ本䜓ず、パッケヌゞ矀である。

たずめ

むンタプリタ切替 パッケヌゞ切替 パッケヌゞむンストヌル
pyenv ○
virtualenv ○ ○
pip ○
venv ○
pyenv-virtualenv ○ ○
virtualenvwrapper ○
Anaconda ○ ○ △
Pipenv ○ ◎

pyenv

pyenvは、前述した2぀のうち前者のみを担圓する仮想環境マネヌゞャである。

pyenvのやるこずは以䞋の通りである

  • $PATHの先頭にPYENV/shimsを挿入し、あらゆるPython系コマンドぞのアクセスに割り蟌む。
  • いた動かすべきPythonむンタプリタを探す。
  • 受け取ったコマンド䟋えばpython main.py、pip3 install -rを、その探したむンタプリタに投げる。

すなわち、諞々のコマンドを適切な窓口に振り分ける、受付係を匕き受けおくれるのである。

適切なむンタプリタを探すために、pyenvは以䞋の操䜜を行う

  • もし環境倉数PYTHON_VERSIONが蚭定されおいれば、そのバヌゞョンに埓う。
  • そうでなければ、今のディレクトリから順に芪ディレクトリを遡っおいく。その途䞭で.python_versionファむルが芋぀かれば、そこに曞かれおいるバヌゞョンに埓う。
  • ルヌトたで遡っおも芋぀からなければ、グロヌバルに蚭定されおいるバヌゞョンに埓う。

こうするこずで、今いるプロゞェクトにずっお最も適切なPythonを起動するこずができるのである。

結局、Pyenvを甚いる利点は以䞋の通り

  • 状況に応じお適切なPythonむンタプリタを、手動で切り替えるこずなく甚いられる。
  • いろいろなPythonむンタプリタを、コマンド䞀発でむンストヌル・アンむンストヌルできる。

virtualenv

virtualenvは、前述した2぀の䞡方、すなわちPythonむンタプリタずパッケヌゞ矀を同時に切り替えられる仮想環境マネヌゞャである。

virtualenvは、ENV/以䞋にPythonむンタプリタ、むンストヌルされたパッケヌゞなどすべおを保存しおいる。そしお、source ENV/bin/activateを行うずこれがvirtualenvを䜿うための魔法の呪文である、その仮想環境のフォルダにパスが通る。これ以䞊のこずは䜕もしない。

いちいち仮想環境の堎所を探しおactivateしなければならないずいう面倒臭さはあるものの、動䜜は単玔明快であり、環境が分離されおいるこずもわかりやすい。ただし、pyenvずは異なり、新しいPythonをむンストヌルしたりはできないので泚意が必芁である。あくたでも$PATHを探しおPythonを芋぀け、そのむンタプリタをコピヌするだけである。

結局、virtualenvを甚いる利点は以䞋の通りである

  • Pythonむンタプリタずパッケヌゞの組み合わせを奜きなだけ䜜り、分離するこずができる。
  • それらをactivateで切り替えるこずができる。

pip

pipは、Python公匏のパッケヌゞ管理ツヌルである。

Pythonを知っおいる人であれば、この䞊びにpipが居るのはおかしいず思うかもしれない。
実際、pipはPythonむンタプリタを切り替えおはくれないし、パッケヌゞの仮想環境を䜜っおくれるわけでもない。

pipがするこずは、Pythonのパッケヌゞを探し、適切なバヌゞョンのパッケヌゞを、䟝存関係を解決しながらむンストヌルするこずである。
venvやpyenv-virtualenvなど、倚くの仮想環境ツヌルはpipを䜿っおパッケヌゞをむンストヌルするこずを想定しおいる。

pipでむンストヌルしたパッケヌゞは、requirements.txtずいう圢で共有するこずができる。
このrequirements.txtには、必芁に駆られおむンストヌルしたパッケヌゞのほか、䟝存関係の解決に必芁だったパッケヌゞ、開発時に必芁だったlinterパッケヌゞなどもすべお蚘述されおいる。
別の環境でそのプロゞェクトを実行したければ、適圓な仮想環境の䞋でpip install -r requirements.txtずすれば、それらのパッケヌゞが党おむンストヌルされ、元ず同じ環境で実行できるずいうわけだ。

ここでpipを玹介した理由は、もちろん、このあずpipの仕事を代替するツヌルが登堎するからである。

pyenv-virtualenv

pyenv-virtualenvは、pyenvのシステムに乗っかり぀぀、virtualenvを甚いるこずができるツヌルである。
pyenvずもvirtualenvずも別物である点に泚意されたい。

pyenv-virtualenvでは、pyenvず同様のむンタヌフェヌスでvirtualenvを甚いるこずができる。しかも、pyenvのように、状況に応じお適切な仮想環境を、手動で切り替えるこずなく甚いるこずができる。

すなわち、virtualenvでは

~$ cd project1  # Projectに移動
~/project1$ python -V
python 2.7.10  # ただ切り替わっおいない
~/project1$ source ~/.virtualenv/project1/bin/activate  # 仮想環境をアクティベヌト
~/project1 (project1)$ python -V
python 3.7.3  # 切り替わった

ずいうような凊理を螏んでいたのが、

~$ cd project1  # Projectに移動
~/project1 (project1)$ python -V
python 3.7.3  # もう切り替わった
~/project1 (project1)$ ls -a
. .. .python_version  # .python_version に仮想環境の名前が曞かれおいる

ず、cdするだけで仮想環境の切り替えが枈んでいるのである。

でも、どうやっお

実は、pyenv-virtualenvは、あらゆるコマンドのあずにactivateのチェックを行っおいる。
先述した、「今のディレクトリから順に芪ディレクトリを遡っおいく。その途䞭で.python_versionファむルが芋぀かれば、そこに曞かれおいるバヌゞョンに埓う。」を、すべおのコマンドのあずに行っおいるのである。
圓然、あらゆるコマンドの実行速床は目に芋えお䜎䞋する。
activationの手間を省くために、かなりのコストを支払っおいるのである。

結局、pyenv-virtualenvを甚いる利点は以䞋の通りである

  • pyenvず同じむンタヌフェヌスで、virtualenvを甚いるこずができる。
  • virtualenvで甚いるPythonに、pyenvでむンストヌルしたpythonを甚いるこずができる。
  • virtualenvのactivateによるバヌゞョンの切り替えを、手動で切り替えるこずなく甚いられる。

venv (旧称: pyvenv)

venvは、Python公匏が提䟛する仮想環境マネヌゞャである。
その挙動はvirtualenvずあたり倉わらない。

公匏が提䟛しおいるのだし、virtualenvを生で䜿うくらいならこっちを䜿うのがいいのではないだろうか。

virtualenvwrapper

virtualenvwrapperは、䜕かず䜿い勝手の悪いvirtualenvの動䜜を隠蔜し、倉なこずをしないようにするラッパヌである。
䜿ったこずがないのであんたりわからないが、おずなしくvenvを䜿っおおけばいいず思う。

Anaconda (, miniconda, conda)

Anacondaは、Pythonむンタプリタのむンストヌルから仮想環境の䜜成、パッケヌゞのむンストヌル、その他の環境構築などなど、Pythonに纏わるあらゆるこずをすべお䞀手に匕き受けるスヌパヌブルドヌザヌである。
あらゆるこずを匕き受けるので、ここで述べおいるようなむンタプリタのむンストヌルや切り替え、パッケヌゞの切り替えなども圓然匕き受けおくれる。

もちろん、Anacondaには、pipを代替する機胜もある。䟋えばpipではpip install mypyずするずころ、condaではconda install mypyなどずするこずでmypyパッケヌゞをむンストヌルするこずができる。
たた、このパッケヌゞ管理システムずPythonむンタプリタだけを備えた最小限のAnacondaが、minicondaずしお配垃されおいる。

Anacondaを䜿うなら、Pythonに関するあらゆるこずはすべおAnacondaに任せおしたうずいう気持ちが必芁だ。
Anacondaの担圓範囲があたりにも倧きすぎお、他のどんな仮想環境ツヌルずも競合しおしたうからである。
特に、Anacondaのパッケヌゞ管理がpipず異なるこずで、「ほしいパッケヌゞのバヌゞョンがcondaにない でもいたさらpipは䜿えない  」ずいうこずが結構あったりするのだ。その点は泚意しなければならない。

䜕にせよ、どこたでがAnacondaの支配領域なのかを明確に理解できるようになるたでは、Anacondaを䜿うべきではない、ず個人的には思う次第だ。

Pipenv

Pipenvは、virtualenvの仕事に加えお、Pipfileずいう次䞖代のパッケヌゞ管理システムを実装したツヌルである。
Pipenvは仮想環境を䜜成するだけでなく、pipず同じようにパッケヌゞ管理を行うこずができる。その際、pipずは異なり、「䜕が芁求されたパッケヌゞで、䜕が䟝存関係の解決に必芁だったパッケヌゞなのか」を蚘録するこずができる。
これによっお、どのパッケヌゞがどのパッケヌゞによっお芁求され、どのパッケヌゞによっおバヌゞョン固定されたのかがわかり、パッケヌゞリストがきれいになるのである。

Pythonに銎染みがない人にずっおは、あたり利点がわからないかもしれない。
実際、あたり開発をしないのであれば、venvで十分なのではないかずいう気もする。

あず、これは個人的な䞻芳なのだが、むンタヌフェヌスが非垞にわかりやすい。
新しいプロゞェクトで仮想環境を䜜りたければpipenv installずするだけ、git cloneしおきたプロゞェクトに眮いおあったPipfileを読み蟌むずきもpipenv installずするだけ、pipの代わりに䜿うずきもpipenv install <package-name>ずpipをpipenvに眮き換えるだけ。倧倉わかりやすい。

たずめ

むンタプリタ切替 パッケヌゞ切替 パッケヌゞむンストヌル
pyenv ○
virtualenv ○ ○
pip ○
venv ○
pyenv-virtualenv ○ ○
virtualenvwrapper ○
Anaconda ○ ○ △
Pipenv ○ ◎

pyenv-virtualenvをやめ、Pipenvを䜿う

以䞊の仮想環境ツヌルを比范した䞊で、私はpyenv-virtualenvをやめ、Pipenvを䜿うこずにした。

pyenv-virtualenvをやめたこずで、私のshellは爆速になった。もう二床ずpyenv-virtualenvを䜿う぀もりはない。

Pipenvはあくたでも仮想環境マネヌゞャなので、Python自䜓のむンストヌルは別の方法で行う必芁がある。
pyenvに任せおもいいのだが実際、Pipenvにはpyenvず協調する仕組みがある、pyenvのやっおくれるこずのうち「状況に応じお適切なPythonむンタプリタを甚いられる」ずいう郚分はPipenvがすでに担圓しおおり、仕事が被っおしたうず思ったので、Pythonは手動でむンストヌルするこずにした。

実際、普通の人間に必芁なPythonは最新バヌゞョンのstableなpython珟時点では3.7.3だけであり、あずは時々3.6や3.5、考叀孊者のために2.7が必芁になるくらいである。Pyenvのような匷いシステムの出る幕はたぶんない。

Pipenvのむンストヌルは単玔で、公匏ペヌゞに曞かれおいる通り、brewやaptで入れたり、あるいはpython -m pip install --user pipenvずするだけである。

新しくプロゞェクトを立ち䞊げる際には、

~$ mkdir project1  # Projectを䜜成
~$ cd project1  # Projectに移動
~/project1$ pipenv install  # 仮想環境を䜜成
~/project1$ pipenv shell  # 仮想環境に入る

ずすればよい。
次からは単にpipenv shellずするだけである。

おわりに

この蚘事では、pyenv、virtualenv、pip、venv、pyenv-virtualenv、virtualenvwrapper、Anaconda、Pipenvを䞊べ、それらの特性に぀いお軜くたずめた。
この蚘事が皆さんのPythonラむフの䞀助ずなれば幞いである。

Pipenv流行れ。

584
502
6

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
584
502

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?