macOS の Python の環境について (システム, MacPorts, pyenv, pyenv-virtualenv)
Table of Contents
はじめに
MacPorts を使って OpenModelica をインストールしたので、フリーソフトの管理ツールも MacPorts にします。Python に関しては、
- システム(masOS付属)の Python
- MacPorts でインストールされる Python
- Anaconda などのディストリビューションの環境
- 特定の開発プロジェクトなどで使用する環境
などを互いに干渉しないように使い分ける必要があります。どのように考え、どう切り替えたらいいかについてまとめました。自分用の忘備録です。
システム(macOS付属) の Python
macOS に最初から付属している Python です。これらの Python は、macOS のソフトウェア・アップデートで管理され、macOS のシステムが使用するのでなるべく環境を改変しないようにしようと思います。
ターミナルを起動して、python または python3 と入力すると起動します。macOS Catalina の場合、それぞれ、
% python WARNING: Python 2.7 is not recommended. This version is included in macOS for compatibility with legacy software. Future versions of macOS will not include Python 2.7. Instead, it is recommended that you transition to using 'python3' from within Terminal. Python 2.7.16 (default, Nov 9 2019, 05:55:08) [GCC 4.2.1 Compatible Apple LLVM 11.0.0 (clang-1100.0.32.4) (-macos10.15-objc-s on darwin Type "help", "copyright", "credits" or "license" for more information. >>>
% python3 Python 3.7.3 (default, Nov 15 2019, 04:04:52) [Clang 11.0.0 (clang-1100.0.33.16)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>>
となります。Python 2.7.16 と Python 3.7.3 が入っています。
MacPortsのPython
MacPorts を使ってインストールされた Python です。同じくMacPorts を使ってインストールされたソフトウェアに Python インターフェースがある場合は、この環境を使用します。通常は none の状態にしてシステムの Python を使う設定にします。必要に応じて一時的に使うように切り替えることにします。
MacPorts で管理できるインストール済み Python を確認する
port select python と入力すると、MacPorts を使って管理できるインストール済みの Python 環境がわかります。(active) が付いている Python が選択されています。デフォルトは none でシステムの Python 環境を使う状態です。
% port select python Available versions for python: none (active) python27 python27-apple python36 python37
MacPorts の Python 環境の切り替える
python36 を使用したいときは、次の様に入力します。
% sudo port select python python36 Password: Selecting 'python36' for 'python' succeeded. 'python36' is now active.
確認します。
% port select python Available versions for python: none python27 python27-apple python36 (active) python37
python のバージョン確認して、起動してみます。
% python --version Python 3.6.10 % python Python 3.6.10 (default, Dec 22 2019, 00:54:40) [GCC 4.2.1 Compatible Apple LLVM 11.0.0 (clang-1100.0.33.12)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>>
exit() または Ctrl-D で終了します。
同様に、以下の様に入力することによってシステムの Python 環境に戻せます。
% sudo port select python none Password: Selecting 'none' for 'python' succeeded. 'none' is now active. % python --version Python 2.7.16
Python 関連のパッケージの確認してインストールする
https://ports.macports.org で Python を検索するとインストール可能な Python 関連のパッケージがわかります。パッケージを確認して、例えば python35 をインストールする場合は以下の様に入力します。
sudo port install python35
確認します。
% port select python Available versions for python: none (active) python27 python27-apple python35 python36 python37
同様に、以下の様にアンインストールします。
% sudo port uninstall python35
port select コマンドで切り替え可能なソフトウェア
Python 以外のソフトウェアも port select コマンドでバージョンの切り替えが可能です。対象となるソフトウェアは以下の様にして確認できます。表示はインストール済みのソフトウェアに依存します。
% port select --summary Name Selected Options ==== ======== ======= clang none mp-clang-8.0 mp-clang-9.0 none cython none cython27 none gcc none mp-gcc5 mp-gcc9 none llvm none mp-llvm-8.0 mp-llvm-9.0 none mpi none mpich-mp-fortran none nosetests none nosetests27 none pygments none py37-pygments none python none python27 python27-apple python36 python37 none python2 none python27 python27-apple none python3 none python36 python37 none wxWidgets none wxWidgets-3.0 none
pyenv の環境
pyenv は、バージョンの異なる Python や Anaconda などのディストリビューションの利用環境を簡単にインストールすることができます。pyenv global コマンドは、全体で使用する環境を設定します。pyenv local コマンド を使用すると、Python のバージョンやディストリビューションを、ディレクトリ毎に割り当てて切り替えることができます。
通常は、pyenv global コマンドで system (システムのPython) を設定し、ディレクトリ移動で環境を切り替えたいと思います。pyenv でインストールした環境は、主に、Anaconda などで Jupyter Notebook などを利用したいときに使用します。MacPorts には pyenv のパッケージが無いので、https://github.com/pyenv/pyenv からインストールします。
pyenv をインストールする
まず、git で pyenv を取得します。
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
~/.zshrc に以下を記述します。
export PYENV_ROOT="$HOME/.pyenv" export PATH="$PYENV_ROOT/bin:$PATH" if command -v pyenv 1>/dev/null 2>&1; then eval "$(pyenv init -)" fi
本家やいろいろなサイトを参考にすると、この設定は ~/.zshenv に記述するように書かれています。比較的最近( 2019年年末頃) MacPorts をインストールすると ~/.zprofile に次の様な設定が追加されています。
# MacPorts Installer addition on 2019-12-30_at_18:07:53: adding an appropriate PATH variable for use with MacPorts. export PATH="/opt/local/bin:/opt/local/sbin:$PATH" # Finished adapting your PATH environment variable for use with MacPorts.
MacPorts の設定より pyenv の設定を優先させるために、~/.zprofile より後に読み込まれる ~/.zshrc に上記設定を書き込むことにしました。
ログインスクリプトを読み込むので一応再ログインして環境変数 PATH の設定を確認します。
% echo $PATH /Users/xxxxx/.pyenv/shims:/Users/xxxxx/.pyenv/bin:/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin
pyenv > Macports > システムの優先順位で設定されています。
いろいろなバージョンのPython や Anaconda などをインストールする
ターミナルを起動して、
pyenv install --list
と入力すると、インストール可能な Python のバージョンや Anaconda のディストリビューションなどが表示されます。anaconda3-2019.10 をインストールしてみます。以下の様に入力します。
pyenv install anaconda3-2019.10
以下の様にして、インストールされている環境を確認します。
% pyenv versions * system (set by /Users/xxxxx/.pyenv/version) anaconda3-2019.10
出力された1行目の system は、システムの Python または MacPorts の Python です。2行目の anaconda3-2019.10 が今インストールした環境です。行頭の * が現在アクティブな環境です。
python 3.7.0 をインストールしてみます。
% pyenv install 3.7.0 /Users/xxxxx/.pyenv/plugins/python-build/bin/python-build: 行 1541: brew: コマンドが見つかりません /Users/xxxxx/.pyenv/plugins/python-build/bin/python-build: 行 1541: brew: コマンドが見つかりません Downloading openssl-1.1.0j.tar.gz... -> https://www.openssl.org/source/openssl-1.1.0j.tar.gz Installing openssl-1.1.0j... Installed openssl-1.1.0j to /Users/xxxxx/.pyenv/versions/3.7.0 Downloading readline-8.0.tar.gz... -> https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz Installing readline-8.0... Installed readline-8.0 to /Users/xxxxx/.pyenv/versions/3.7.0 Downloading Python-3.7.0.tar.xz... -> https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz Installing Python-3.7.0... python-build: use zlib from xcode sdk Installed Python-3.7.0 to /Users/xxxxx/.pyenv/versions/3.7.0
「コマンド brew が見つかりません」が出ています。調べてみると brew –prefix “${openssl}” という Homebrew のコマンドを使用しています。 Homebrew を使って openssl をインストールしていたらそれを使うようです。/usr/bin/openssl にシステムの openssl がありMacPorts の openssl と readline もインストール済みですが、これらを使わずソースコードから .pyenv 内のバージョン毎にディレクトリにインストールしているようです。コンパイルに少し時間がかかりますがエラーでは無いようです。以下のように確認するとインストールは成功しています。後述の pyenv-virtualenv のところで動作確認もできました。
% pyenv versions * system (set by /Users/xxxxx/.pyenv/version) 3.7.0 anaconda3-2019.10
現状では
- Python 3.8.0
- Python 3.8.1
はインストールに失敗しました。
Python の環境を切り替える
切り替え前の Python のバージョンを確認します。
% python --version Python 2.7.16
pyenv global コマンドで環境を anaconda3-2019.10 に切り替えます。
% pyenv global anaconda3-2019.10
pyenv versions でアクティブな環境を確認します。
% pyenv versions system * anaconda3-2019.10 (set by /Users/xxxxx/.pyenv/version)
python のバージョンを確認します。
% python --version Python 3.7.4 % python Python 3.7.4 (default, Aug 13 2019, 15:17:50) [Clang 4.0.1 (tags/RELEASE_401/final)] :: Anaconda, Inc. on darwin Type "help", "copyright", "credits" or "license" for more information. >>>
exit() または Ctrl-D を入力して Python を終了します。
同様に、pyenv global コマンドで system の環境に戻します。
% pyenv global system % pyenv versions * system (set by /Users/xxxxx/.pyenv/version) anaconda3-2019.10 % python --version Python 2.7.16
ディレクトリ移動で Python の環境を切り変える
任意のディレクトリを作成して、そのディレクトリに移動したときに自動的に Python の環境が切り替わるようにします。
ディレクトリ名を ana3_201910 とし、Python環境を anaconda3-2019.10 とします。pyenv local コマンドを使用します。
% mkdir ana3_201910 % cd ana3_201910 % pyenv local anaconda3-2019.10 (anaconda3_2019.10) %
上の様に、pyenv local コマンドを実行すると、プロンプトにpythonの環境名 (anaconda3_2019.10) が付きます。ディレクトリの外では次の様にシステムの環境になります。
(anaconda3_2019.10) % cd .. % pyenv versions * system (set by /Users/xxxxx/.pyenv/version) anaconda3-2019.10 % python --version Python 2.7.16
ディレクトリの中では次の様になります。
% cd ana3_201910 (anaconda3-2019.10) % pyenv versions system * anaconda3-2019.10 (set by /Users/xxxxx/ana3_201910/.python-version) (anaconda3-2019.10) % python --version Python 3.7.4
このような環境を作っておくと、
% cd ana3_201910 (anaconda3-2019.10) % jupyter notebook
ですぐに Anaconda の環境で Jupyter Notebook が使えます。
参考
- pyenv/pyenv: Simple Python version management – GitHub
- Mac OSX, Zsh の環境で pyenv
- pyenvを使ってMacにPythonの環境を構築する
- zshの設定ファイルの読み込み順序と使い方 Tipsまとめ
pyenv-virtualenv の環境
pyenv でインストールした Python の環境をベースにして仮想環境をつくり、そこにいろいろなパッケージをインストールして、独自の環境を作りたい場合に使用します。この環境も pyenv local を使用してディレクトリ移動で切り替えたいと思います。
pyenv-virtualenv は pyenv のプラグインで、virtualenv と conda の環境を管理する役割を演じます。
pyenv-virtualenv をインストールする
まず、git で pyenv-virtua lenv を取得します。
git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
~/.zshrc を次に様に改変します。
export PYENV_ROOT="$HOME/.pyenv" export PATH="$PYENV_ROOT/bin:$PATH" if command -v pyenv 1>/dev/null 2>&1; then eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)" fi
有効にするためターミナルを再起動します。
仮想環境を作成する
pyenv virtualenv コマンドで、先ほどインストールした Python 3.7.0 を使う仮想環境 p370env を作成します。
% pyenv virtualenv 3.7.0 p370env Looking in links: /var/folders/l5/9szl6rr95dx72v_qskw1lk6c0000gn/T/tmpb81sc07s Requirement already satisfied: setuptools in /Users/xxxxx/.pyenv/versions/3.7.0/envs/p370env/lib/python3.7/site-packages (39.0.1) Requirement already satisfied: pip in /Users/xxxxx/.pyenv/versions/3.7.0/envs/p370env/lib/python3.7/site-packages (10.0.1) % pyenv versions * system (set by /Users/xxxxx/.pyenv/version) 3.7.0 3.7.0/envs/p370env anaconda3-2019.10 p370env
ディレクトリ移動で仮想環境を切り替える
任意のディレクトリを作成し、仮想環境と関連づけます。ディレクトリ名を p370prj とします。pyenv local コマンドを使います。
% mkdir p370prj % cd p370prj % pyenv local p370env (p370env) %
プロンプトの先頭に (環境名) がつきます。このディレクトリから抜けると pyenv global コマンドで設定されている環境に戻ります。
(p370env) % cd .. % pyenv versions * system (set by /Users/xxxxx/.pyenv/version) 3.7.0 3.7.0/envs/p370env anaconda3-2019.10 p370env
再びディレクトリ p370prj に移動して、バージョンを確認します。
% cd p370prj (p370env) % pyenv version p370env (set by /Users/xxxxx/p370prj/.python-version) (p370env) % python --version Python 3.7.0
仮想環境を使ってみる
ターミナルでディレクトリを p37prj に移動して、仮想環境に pip install コマンドでいろいろインストールします。
(p370env) % pip install numpy (p370env) % pip install --upgrade pip (p370env) % pip install scipy (p370env) % pip install matplotlib
python を起動してグラフを描いてみます。[python入門]ライブラリ Matplotlib の基本的な使い方 を参考にしました。
(p370env) % python Python 3.7.0 (default, Jan 4 2020, 22:40:01) [Clang 11.0.0 (clang-1100.0.33.16)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import math >>> import numpy as np >>> from matplotlib import pyplot as pl >>> pi = math.pi >>> x = np.linspace(0, 2*pi, 100) >>> y = np.sin(x) >>> pl.plot(x,y) [<matplotlib.lines.Line2D object at 0x1127519b0>] >>> pl.show()
インストールしたバッケージを確認して保存する
仮想環境に pip install コマンドでインストールしたパッケージは pip freeze コマンドで確認し、ファイルに保存することができます。
(p370env) % pip freeze cycler==0.10.0 kiwisolver==1.1.0 matplotlib==3.1.2 numpy==1.18.0 pyparsing==2.4.6 python-dateutil==2.8.1 scipy==1.4.1 six==1.13.0 (p370env) % pip freeze > p370prj.list
再びこれらのパッケージをインストールするときは以下のようにします。
pip install -r p370prj.list
Python や仮想環境を削除する
作成した仮想環境 p370env とPython 3.7.0 を削除します。pyenv uninstall コマンドを使用します。
% pyenv uninstall p370env pyenv-virtualenv: remove /Users/xxxxx/.pyenv/versions/3.7.0/envs/p370env? y % pyenv uninstall 3.7.0 pyenv: remove /Users/xxxxx/.pyenv/versions/3.7.0? y % pyenv versions * system (set by /Users/xxxxx/.pyenv/version) anaconda3-2019.10
参考
- pyenv/pyenv-virtualenv: a pyenv plugin to manage virtualenv
- pyenv-virtualenv でディレクトリ単位のpython環境構築
- pyenv-virtualenv を使って都合いいように Python パッケージ環境を行き来する話
- pyenv と pyenv-virtualenv の使い方
- [python入門]ライブラリ Matplotlib の基本的な使い方
以上。
“macOS の Python の環境について (システム, MacPorts, pyenv, pyenv-virtualenv)” に対して1件のコメントがあります。