macOS の Python の環境について (システム, MacPorts, pyenv, pyenv-virtualenv)

はじめに

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

 

参考

 

以上。

macOS の Python の環境について (システム, MacPorts, pyenv, pyenv-virtualenv)” に対して1件のコメントがあります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です