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のインストール。
1 |
$ brew install pyenv |
pyenvのインストール確認。
1 2 |
$ pyenv --version pyenv 1.2.9 |
pyenvに対してパスを通し、通常利用するpythonをシステムdefaultからpyenvに変更する。
1 2 3 4 5 6 7 8 |
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc $ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc $ echo 'eval "$(pyenv init -)"' >> ~/.bashrc $ $ source ~/.bashrc $ $ which python ~/.pyenv/shims/python |
パスを通してbashrcの再読み込みを実行してもpythonの向き先がシステム標準から変わらない場合は、/etc/paths
に定義されているbinの優先順位がシステム標準の方が上になっている可能性がある。
/etc/paths
の優先順位を確認し、/usr/local/bin
の方が/usr/bin
よりも上になるように修正する。
1 2 3 4 5 6 |
$ cat -n /etc/paths 1 /usr/local/bin 2 /usr/bin 3 /bin 4 /usr/sbin 5 /sbin |
pythonのインストールとバージョン切り替え
プロジェクト毎にpythonバージョン切り替え
インストールされているpythonバージョンの確認。
1 2 |
$ pyenv versions * system (set by /Users/shin/.pyenv/version) |
上記はシステム標準のpythonしかインストールされていない状態。
ここに試しに2系の最新と3.6系の最新をインストール。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$ pyenv install --list Available versions: 2.1.3 2.2.3 [以下略] $ pyenv install 2.7.15 python-build: use openssl from homebrew [以下略] Installed Python-2.7.15 to /Users/shin/.pyenv/versions/2.7.15 $ $ pyenv install 3.6.8 python-build: use openssl from homebrew [以下略] Installed Python-3.6.8 to /Users/shin/.pyenv/versions/3.6.8 $ $ pyenv versions * system (set by /Users/shin/.pyenv/version) 2.7.15 3.6.8 |
pyenvでローカルのpythonバージョンを切り替える。
1 2 3 4 5 6 7 8 9 |
$ mkdir python_ver_test $ cd python_ver_test $ pyenv local 3.6.8 $ python -V Python 3.6.8 $ pyenv versions system 2.7.15 * 3.6.8 (set by ~/python_ver_test/.python-version) |
これでプロジェクト毎にpythonバージョンを自由に切り替えられるようになった。
補足:グローバルのpythonバージョン切り替え
グローバルのpythonバージョンの切り替えはpyenv global
コマンドで実施。
1 |
$ pyenv gloval 3.6.8 |
venvでpython仮想環境構築
ここから先はpython3.3以上が必要。
venv仮想環境構築。
2つ目のvenvは作成するディレクトリ名称なので任意変更可(ただしvenvという名が推奨らしい)。
1 2 3 |
$ python -m venv venv $ ls venv |
Activate & Deactivate
1 2 3 4 5 6 |
$ . venv/bin/activate (venv) localhost:python_ver_test $ (venv) localhost:python_ver_test $ python -V Python 3.6.8 (venv) localhost:python_ver_test $ deactivate $ |
これでグローバルを汚さずにプロジェクト毎にパッケージ管理が行えるようになった。
2019/1/26追記:pipenv導入と利用
pipenv導入
pipenvのインストール。
1 2 3 4 5 |
$ brew install pipenv [略] $ $ pipenv --version pipenv, version 2018.11.26 |
pipenv利用(pyenv+venv+pipenv利用)
pipenvを利用してパッケージをインストールする。ひとまずvenvの仮想化環境で試してみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
$ mkdir pipenv_test $ cd pipenv_test $ pyenv local 3.6.8 $ python -V Python 3.6.8 $ python -m venv venv $ ls venv $ . venv/bin/activate (venv) $ (venv) $ pipenv install requests Creating a Pipfile for this project… Installing requests… [中略] Installing dependencies from Pipfile.lock (b14837)… 🐍 ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 5/5 — 00 (venv) $ ls Pipfile Pipfile.lock venv (venv) $ python -V Python 3.6.8 (venv) $ pip list Package Version ---------- ---------- certifi 2018.11.29 chardet 3.0.4 idna 2.8 pip 18.1 requests 2.21.0 setuptools 40.6.2 urllib3 1.24.1 (venv) $ cat -n Pipfile 1 [[source]] 2 name = "pypi" 3 url = "https://pypi.org/simple" 4 verify_ssl = true 5 6 [dev-packages] 7 8 [packages] 9 requests = "*" 10 11 [requires] 12 python_version = "3.6" |
問題なくインストールとPipfileでの依存関係の記録ができている模様。
pipenv利用(pyenv+pipenv+virtualenv利用)
次はvenvを使わず実施してみる。(venvの代わりに勝手にvirtualenvが使われるようになる)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
$ mkdir pipenv_test2 $ cd pipenv_test2 $ pyenv local 3.6.8 $ pip list Package Version ---------- ------- pip 18.1 setuptools 40.6.2 $ $ ls $ $ pipenv install requests Creating a virtualenv for this project… Pipfile: /Users/shin/Desktop/pipenv_test2/Pipfile Using /usr/local/Cellar/pipenv/2018.11.26/libexec/bin/python3.7 (3.7.2) to create virtualenv… ⠋ Creating virtual environment...Already using interpreter /usr/local/Cellar/pipenv/2018.11.26/libexec/bin/python3.7 Using real prefix '/usr/local/Cellar/python/3.7.2_1/Frameworks/Python.framework/Versions/3.7' New python executable in /Users/shin/.local/share/virtualenvs/pipenv_test2-HdibGsYh/bin/python3.7 Also creating executable in /Users/shin/.local/share/virtualenvs/pipenv_test2-HdibGsYh/bin/python Installing setuptools, pip, wheel... done. ✔ Successfully created virtual environment! Virtualenv location: /Users/shin/.local/share/virtualenvs/pipenv_test2-HdibGsYh Creating a Pipfile for this project… Installing requests… Adding requests to Pipfile's [packages]… ✔ Installation Succeeded Pipfile.lock not found, creating… Locking [dev-packages] dependencies… Locking [packages] dependencies… ✔ Success! Updated Pipfile.lock (444a6d)! Installing dependencies from Pipfile.lock (444a6d)… 🐍 ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 5/5 — 00:00:01 To activate this project's virtualenv, run pipenv shell. Alternatively, run a command inside the virtualenv with pipenv run. $ $ ls Pipfile Pipfile.lock $ pip list Package Version ---------- ------- pip 18.1 setuptools 40.6.2 |
venvなしでpipenv install
を実行すると、インストール自体はうまくいっているようだがなにやらvirtualenv使え的な内容が表示された。pip list
でインストール後のパッケージを確認してもrequestsモジュールは確認できない。
そこでおとなしく指示に従いpipenv shell
コマンドを実行してみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
$ ls Pipfile Pipfile.lock $ pipenv shell Launching subshell in virtual environment… . ~/.local/share/virtualenvs/pipenv_test2-HdibGsYh/bin/activate bash-3.2$ . ~/.local/share/virtualenvs/pipenv_test2-HdibGsYh/bin/activate (pipenv_test2) bash-3.2$ (pipenv_test2) bash-3.2$ python -V Python 3.7.2 (pipenv_test2) bash-3.2$ pip list Package Version ---------- ---------- certifi 2018.11.29 chardet 3.0.4 idna 2.8 pip 19.0.1 requests 2.21.0 setuptools 40.6.3 urllib3 1.24.1 wheel 0.32.3 (pipenv_test2) bash-3.2$ exit exit $ |
virtualenvを立ち上げpip list
でパッケージを確認するとrequestsがインストールされていることが確認できた。
しかし、事前にpyenvで指定していたpythonバージョンが無視され、python3.7.2になってしまった。(ちなみにbash-3.2にもなっている)
これを防止するためにはどうやらpipenvでpythonバージョンを指定し、先にvirtualenv環境を作る必要があるらしい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
$ mkdir pipenv_test3 $ cd pipenv_test3 $ python -V Python 2.7.10 $ pipenv --python 3.6.8 Creating a virtualenv for this project… [中略] Virtualenv location: ~/.local/share/virtualenvs/pipenv_test3-JPd9wdJZ Creating a Pipfile for this project… $ python -V Python 2.7.10 $ ls Pipfile $ pipenv install requests Installing requests… [中略] 🐍 ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 5/5 — 00:00:02 To activate this project's virtualenv, run pipenv shell. Alternatively, run a command inside the virtualenv with pipenv run. $ $ pipenv shell Launching subshell in virtual environment… . ~/.local/share/virtualenvs/pipenv_test3-JPd9wdJZ/bin/activate bash-3.2$ . ~/.local/share/virtualenvs/pipenv_test3-JPd9wdJZ/bin/activate (pipenv_test3) bash-3.2$ python -V Python 3.6.8 (pipenv_test3) bash-3.2$ pip list Package Version ---------- ---------- certifi 2018.11.29 chardet 3.0.4 idna 2.8 pip 19.0.1 requests 2.21.0 setuptools 40.6.3 urllib3 1.24.1 |
できた。ちなみにpipenv --python
で指定したpythonバージョンがインストールされていなければ、pyenvが勝手にインストールしてくれるらしい。
2019/1/26追記:結論
とりあえず、python環境構築にpyenvとpipenvは必須。venv / virtualenvのどちらを利用するかは好みの問題で良さそうです。(個人的にはvenvでやります。)