とあるエンジニアの作業ブログ

Python

MacのPython環境最適解!? 〜pyenv+venv+pipenvでPython環境構築〜

投稿日:2019年1月24日 更新日:

Macにpyenv+venvでPython環境構築をした時のメモ。
Anacondaを使うか迷ったが、色々調べたところAnacondaは環境を破壊するとか、Homebrewとコンフリクトするとか色々問題がありそうなので上記の方法を選んだ。
pyenvでバージョンを管理し、venvで環境の独立性を担保する。

2019/1/26 追記
pipenvというパッケージマネージャでnode.jsのpackage.jsonようにパッケージ環境の抽象化ができることを知りました。

  • pyenv ··· Pythonのバージョンマネージャ。これにより同一ホストでプロジェクト毎にpythoのバージョンを切り替えれるようになる
  • venv ··· python3.3以降から標準搭載されたpython仮想環境構築機能。これによりパッケージをプロジェクト毎にインストールできるようになりグローバルを汚さずに済む
  • pipenv ··· パッケージ環境を抽象化する機能。pipenv経由でインストールしたパッケージの依存関係は、Pipfileというファイルに記録され、Pipfileを移行するだけでパッケージ環境移行が可能。

python3.2以下を書くことは、、、今後無いでしょう。
そういう機会があったらそのとき考えます。

動作環境

  • Mac OS High Sierra
  • Homebrew 1.9.2

pyenvのインストールと設定

まずは何はともあれpyenvのインストール。

pyenvのインストール確認。

pyenvに対してパスを通し、通常利用するpythonをシステムdefaultからpyenvに変更する。

パスを通してbashrcの再読み込みを実行してもpythonの向き先がシステム標準から変わらない場合は、/etc/pathsに定義されているbinの優先順位がシステム標準の方が上になっている可能性がある。
/etc/pathsの優先順位を確認し、/usr/local/binの方が/usr/binよりも上になるように修正する。

pythonのインストールとバージョン切り替え

プロジェクト毎にpythonバージョン切り替え

インストールされているpythonバージョンの確認。

上記はシステム標準のpythonしかインストールされていない状態。
ここに試しに2系の最新と3.6系の最新をインストール。

pyenvでローカルのpythonバージョンを切り替える。

これでプロジェクト毎にpythonバージョンを自由に切り替えられるようになった。

補足:グローバルのpythonバージョン切り替え

グローバルのpythonバージョンの切り替えはpyenv globalコマンドで実施。

venvでpython仮想環境構築

ここから先はpython3.3以上が必要。
 
venv仮想環境構築。
2つ目のvenvは作成するディレクトリ名称なので任意変更可(ただしvenvという名が推奨らしい)。

Activate & Deactivate

これでグローバルを汚さずにプロジェクト毎にパッケージ管理が行えるようになった。

2019/1/26追記:pipenv導入と利用

pipenv導入

pipenvのインストール。

pipenv利用(pyenv+venv+pipenv利用)

pipenvを利用してパッケージをインストールする。ひとまずvenvの仮想化環境で試してみる。

問題なくインストールとPipfileでの依存関係の記録ができている模様。

pipenv利用(pyenv+pipenv+virtualenv利用)

次はvenvを使わず実施してみる。(venvの代わりに勝手にvirtualenvが使われるようになる)

venvなしでpipenv installを実行すると、インストール自体はうまくいっているようだがなにやらvirtualenv使え的な内容が表示された。pip listでインストール後のパッケージを確認してもrequestsモジュールは確認できない。
そこでおとなしく指示に従いpipenv shellコマンドを実行してみる。

virtualenvを立ち上げpip listでパッケージを確認するとrequestsがインストールされていることが確認できた。
しかし、事前にpyenvで指定していたpythonバージョンが無視され、python3.7.2になってしまった。(ちなみにbash-3.2にもなっている)
これを防止するためにはどうやらpipenvでpythonバージョンを指定し、先にvirtualenv環境を作る必要があるらしい。

できた。ちなみにpipenv --pythonで指定したpythonバージョンがインストールされていなければ、pyenvが勝手にインストールしてくれるらしい。

2019/1/26追記:結論

とりあえず、python環境構築にpyenvとpipenvは必須。venv / virtualenvのどちらを利用するかは好みの問題で良さそうです。(個人的にはvenvでやります。)

-Python
-

執筆者:


comment

メールアドレスが公開されることはありません。

関連記事

【初心者向け】Pythonで初めてのスクレイピング

Python学習中のためスクレイピングをやってみる。 すでに山ほど参考サイトがあるが、以下がソースも短くライトそうなので拝借し、本家はBeautifulSoupを使っているところをpyqueryに改造 …

Python3.7.1で文章間の類似度判定

python3.7.1でMeCabとWord2Vecを使い文章間の類似度判定を行います。 結構類似の記事があったんですが、pythonのバージョン互換の問題かなんかでそのままだと動かなかったので自分な …