(macOS)pyenvとPython3.9をインストールする

macPCにpyenv(Pythonのバージョン管理ツール)をインストールし、pyenvでpython3.9(2021/1/11時点の最新版)をインストールします。「pyenv + Python」の環境構築をしたい方は、参考にしてみてください。

目的と動作環境

最終更新日:2021/5/4

macPCに、pyenvをインストールし、pyenvでPython3.9.0(2021/1/11時点の最新版)をインストールしていきます。

以前にpython3を使うための環境を作ったのですが、結局Pythonをインストールしてもほぼ何もやらなかったですし、しかも自分がどうやってPythonをインストールしたかも全く覚えていないため、自分のPCの現状のPython環境がどうなっているのかもわからない状況です。

ですのでまずは、現状のPythonの環境を確認をしてから、pyenv + Pythonの環境を構築していきます。今度は忘れないためにも、自分がやった事をちゃんと残しておこうという忘備録的な記事でもあります。

■動作環境やバージョンは以下の通りです。
OS:macOS Big Sur(バージョン11.1)
シェル:bash

ターミナルで使っているシェルとbashのバージョンです。

$ echo "$SHELL"
/bin/bash
$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin20)

macOSではCatalina(バージョン10.15系)からデフォルトシェルがbashからZshに変わりました。ここではbash環境でやった事を書いていますが、Zsh環境でも参考になると思います。pyenvの公式サイトを見る限り、".bash_profile"を".zshrc"に置き換えるぐらいの違いだと思います。

UbuntuOS(バージョン20.04)上でのpyenvとPythonの環境構築については別ページで説明していますので、そちらを参考にしてください。
(Ubuntu)Python3.9.1とpyenvをインストールする(Vagrant)

pyenvとは?

pyenvは、Pythonのシンプルなバージョン管理ツールです。様々なバージョンのPythonをインストールする事ができて、インストールしたバージョンを切り替える事もできます。

ですので、Pythonで何かプログラミングをする時に、最新バージョンで試したり、過去のバージョンで試したりする事が可能です。
開発プロジェクト単位でPythonのバージョンを気軽に変更して開発する事ができるなどのメリットもあります。

初めてPythonを学習しようとする入門者・初心者の方は

ここではpyenvをインストールし、pyenvで最新版のPythonをインストールしていきます。この一連の作業は、最低限ターミナル(CUI)やコマンド操作の知識が必要ですので、その知識がまだ無い方や、プログラミング自体が未経験で独学でPythonを初めて勉強しようという方は、pyenvの環境を作る途中で挫折してしまう可能性があります。

Pythonは最近すごく人気のあるプログラミング言語で、しかも初心者・入門者にとって学習しやすいという評判もありますので、Pythonでプログラミングの勉強を始めようという方もいると思います。そういう方がプログラミングの勉強の前の環境構築の段階でわからなくなって諦めてしまう、辞めてしまうとしたら、凄くもったいないと思います。

ですのでそういう方は、ここで説明しているpyenvを使うのではなく、直接PythonをPCにインストールした方が良いかもしれません。 Pythonの公式からインストーラをダウンロードしてPythonを簡単にインストールできますし、その手順についてもネット上に多くの情報がありますので、そちらを参考にしてPythonをインストールしてみてください。

また、自分のパソコンにPythonをインストールしなくても、Colaboratoryというサイトではブラウザ上でPythonのコードを実行する事ができます。Colaboratoryを使うのに必要な物はGoogleのアカウントだけです。ですので、ちょっとPythonを試してみたい、勉強してみたいという方は、Colaboratoryを使ってみるのも良いかと思います。

現状のPython環境の確認をする

それではまず、現状の環境を確認します。

$ python -V
Python 2.7.16

$ python2 -V
Python 2.7.16

$ python3 -V
Python 3.8.2

$ which python
/usr/bin/python
Python2系とPython3系の両方が入っていました。バージョン3.8のリリース日は2019/10なんですが、まだ一年半も経ってないですね。この時期にPythonをインストールした記憶が全く無いのですが、まぁこの際どうでもいいです。

ちなみにPython2系はmacOSには最初から入っているようです。けど、pythonコマンドを実行してみると、下のようにPython2系は推奨されていない、Python3系に移行する事推奨しますという警告メッセージが出るので、新規で何かするならPython3系を使った方が良さそうですね。

$ 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 23 2020, 08:01:20) 
[GCC Apple LLVM 12.0.0 (clang-1200.0.30.4) [+internal-os, ptrauth-isa=sign+stri on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 

あと、pipのバージョンも確認しておきます。

$ pip -V
pip 1.5.6 from /Library/Python/2.7/site-packages/pip-1.5.6-py2.7.egg (python 2.7)

$ pip2 -V
pip 1.5.6 from /Library/Python/2.7/site-packages/pip-1.5.6-py2.7.egg (python 2.7)

$ pip3 -V
pip 19.2.3 from /Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/site-packages/pip (python 3.8)

$ which pip
/usr/local/bin/pip

pyenvはコマンドエラーが出るので入ってないですね。brew listを見ても存在しません。

$ pvenv
-bash: pyenv: command not found

$ brew list
jq      ncurses     nodebrew    oniguruma   openjdk     scala       tree        watch
brew searchでpyenvを検索してみます。
$ brew search pyenv
==> Formulae
pyenv                                         pyenv-pip-migrate                             pyenv-virtualenvwrapper
pyenv-ccache                                  pyenv-virtualenv
pyenvがありました。 ちなみにHomebrewでは、パッケージの事をFormulaeと言うらしいです。

Kindle Unlimitedなら対象の本が定額で読み放題。対象本には、プログラミングなどのIT関連本、マンガ、雑誌、ビジネス書などがたくさんあります!

Homebrewでpyenvをインストールする

ここではHomebrewでpyenvをインストールしていきますので、Homebrewが入っている事が前提です。もしHomebrewを入れてない方は、まずはHomebrewをインストールしてからこの後に進んでください。Homebrewのインストールについては、"homebrew mac インストール"でググればいくらでも情報が出てくると思います。

現状の環境を把握できたので、Homebrewでpyenvをインストールし、その後にpyenvでPython3.9.0をインストールしていこうと思います。

それではHomebrewでpyenvをインストールします(インストール前に一度Homebrewをupdateしています)。

$ brew update
〜
$ brew install pyenv
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> Updated Formulae
Updated 3 formulae.

==> Downloading https://homebrew.bintray.com/bottles/autoconf-2.69.big_sur.bottle.4.tar.gz
〜
〜
For compilers to find readline you may need to set:
  export LDFLAGS="-L/usr/local/opt/readline/lib"
  export CPPFLAGS="-I/usr/local/opt/readline/include"

For pkg-config to find readline you may need to set:
  export PKG_CONFIG_PATH="/usr/local/opt/readline/lib/pkgconfig"

インストールできたようです。

インストール時のメッセージを一部省略しちゃいましたが、インストール時のメッセージで環境変数LDFLAGSがあります。このあとの話ですが、pyenvでpythonインストール時にLDFLAGSを使用せずに少し詰まりましたので、インストール時のメッセージはすべて控えたおいたほうが良いかもしれません。

再度パッケージ一覧(Formulae)を確認します。

$ brew list
autoconf    ncurses     oniguruma   openssl@1.1 pyenv       scala       watch
jq      nodebrew    openjdk     pkg-config  readline    tree

$ brew search pyenv
==> Formulae
pyenv ✔                                       pyenv-pip-migrate                             pyenv-virtualenvwrapper
pyenv-ccache                                  pyenv-virtualenv
pyenvが追加された事を確認できました(他にもautoconf、readlineなどが依存関係で一緒に追加されましたね)。

pyenvコマンドも実行できるようになっています。

$ pyenv --version
pyenv 1.2.21

pyenvのPythonを使えるように設定する

pyenvをインストールしましたが、今のままだとpyenvのpythonやpipを使用できる状態ではないので、pyenvのpythonを使えるように設定していきます。

シェルがbashの場合、以下のコマンドを実行します。
(*Zshを使っている方は、".bash_profile"を".zshrc"に置き換えてください。これ以降も同様に置き換えてください。)

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bash_profile
コマンドを実行したら、~/.bash_profileファイルの最後に以下のコードが追加されるはずです。
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

このコードを簡単に説明しますと、1行目のexport文は、pyenvのルートディレクトリ(~/.pyenv)を環境変数PYENV_ROOTとして設定しています。
2行目のexport文は、環境変数PATHに"~/.pyenv/bin"を追加しています。

そして、3〜5行目のif構文でPATHに"~/.pyenv/shims"を追加しています。
気になる方は、直接eval "$(pyenv init -)"コマンドをターミナル上で実行すれば、確認できるはずです。

次に、~/.bash_profileに追記したコードを反映させるために以下を実行します。

$ exec $SHELL -l
また、下のコマンドのどちらを実行しても同様に~/.bash_profileに追記したコードが反映されるはずです。
#下のコマンドのどちらかを実行してもO.K.
$ source ~/.bash_profile
$ . ~/.bash_profile

また、新しいターミナルを開いても反映されますので、ターミナルで新規タブを開いても良いと思います。

これで環境変数PATHにpyenv関連のディレクトリが追加されたはずなので、確認してみます。

$ echo $PATH | sed -e 's/:/\n/g'
/Users/〇〇/.pyenv/shims
/Users/〇〇/.pyenv/bin
/opt/local/bin
/opt/local/sbin
/usr/local/bin
/opt/local/bin
/opt/local/sbin
/usr/local/bin
/usr/bin
/bin
〜
最初の2行の"/Users/〇〇/.pyenv/shims"と"/Users/〇〇/.pyenv/bin"が追加されました(*〇〇はユーザ名が入ります)。

/Users/〇〇/.pyenv/shimsディレクトリ下に、python,pip,idle,python3,pydocなどのファイルが入っていますので、python,pipコマンド実行時にこれらが優先して実行されるようになります。

/Users/〇〇/.pyenv/binをPATHに追加しましたが、私の環境ではこのbinディレクトリは存在しないので、追加してもしなくても関係ないような気もします。ただbinディレクトリが存在しなくてPATHに追加して問題は特にないですし、今後なにかのタイミングでbinディレクトリが作成されるかもしれないですし、pyenvの公式でもこうしろと書いてありますので、/Users/〇〇/.pyenv/binをPATHに追加したままにしておきます。

pyenvのpythonなどが使えるようになったはずなので、現状を確認します。

$ pyenv version
3.5.1 (set by /Users/〇〇/.pyenv/version)

$ pyenv versions
  system
* 3.5.1 (set by /Users/〇〇/.pyenv/version)
私の環境では、pyenvのpython3.5.1が最初から入っていて、それが選択されていました。

Pythonのバージョンも確認します。

$ python -V
Python 3.5.1

$ python3 -V
Python 3.5.1

$ which python
/Users/〇〇/.pyenv/shims/python

$ which pip
/Users/〇〇/.pyenv/shims/pip
ちゃんとバージョン3.5.1になっています。あと、python,pipは先程追加したPATH(/Users/〇〇/.pyenv/shims)の物が使用されています。問題なさそうです。

ピックアップPython入門書

新・明解Python入門

Python入門者向けの本です。400ページ強の容量でPythonの基礎がしっかりと学習できる本なので、独学でPythonを勉強する人にオススメです。 プログラミング自体が初めての人はもちろん、他言語の経験はあって初めてPythonを学習しようとする人には特に良い本だと思います。Pythonを勉強して間もない頃は、手元に置いておきたい一冊です。

pyenvでPython3.9.0をインストールする

続いて、pyenvで最新のPythonをインストールします。pyenvでインストールできるPythonのバージョンは、以下のコマンドで確認できます。

$ pyenv install --list 
Available versions:
  2.1.3
  〜
  3.8.6
  3.9.0
  3.9-dev
  3.10-dev
  activepython-2.7.14
  activepython-3.5.4
  〜
私の環境では、3.9.0が最新バージョンだったので(2021/1/11時点)、Python3.9.0をインストールします。
$ pyenv install 3.9.0
python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.9.0.tar.xz...
-> https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tar.xz
Installing Python-3.9.0...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk

BUILD FAILED (OS X 11.1 using python-build 20180424)

Inspect or clean up the working tree at /var/folders/f7/y7pppkwj25l9xs59z2h2z9sh0000gp/T/python-build.20210108044656.81533
Results logged to /var/folders/f7/y7pppkwj25l9xs59z2h2z9sh0000gp/T/python-build.20210108044656.81533.log

Last 10 log lines:
  File "/private/var/folders/f7/y7pppkwj25l9xs59z2h2z9sh0000gp/T/python-build.20210108044656.81533/Python-3.9.0/Lib/ensurepip/__init__.py", line 210, in _main
    return _bootstrap(
  File "/private/var/folders/f7/y7pppkwj25l9xs59z2h2z9sh0000gp/T/python-build.20210108044656.81533/Python-3.9.0/Lib/ensurepip/__init__.py", line 129, in _bootstrap
    return _run_pip(args + [p[0] for p in _PROJECTS], additional_paths)
  File "/private/var/folders/f7/y7pppkwj25l9xs59z2h2z9sh0000gp/T/python-build.20210108044656.81533/Python-3.9.0/Lib/ensurepip/__init__.py", line 38, in _run_pip
    return subprocess.run([sys.executable, "-c", code], check=True).returncode
  File "/private/var/folders/f7/y7pppkwj25l9xs59z2h2z9sh0000gp/T/python-build.20210108044656.81533/Python-3.9.0/Lib/subprocess.py", line 524, in run
    raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '['/private/var/folders/f7/y7pppkwj25l9xs59z2h2z9sh0000gp/T/python-build.20210108044656.81533/Python-3.9.0/python.exe', '-c', '\nimport runpy\nimport sys\nsys.path = [\'/var/folders/f7/y7pppkwj25l9xs59z2h2z9sh0000gp/T/tmp5e0nuwke/setuptools-49.2.1-py3-none-any.whl\', \'/var/folders/f7/y7pppkwj25l9xs59z2h2z9sh0000gp/T/tmp5e0nuwke/pip-20.2.3-py2.py3-none-any.whl\'] + sys.path\nsys.argv[1:] = [\'install\', \'--no-cache-dir\', \'--no-index\', \'--find-links\', \'/var/folders/f7/y7pppkwj25l9xs59z2h2z9sh0000gp/T/tmp5e0nuwke\', \'--root\', \'/\', \'--upgrade\', \'setuptools\', \'pip\']\nrunpy.run_module("pip", run_name="__main__", alter_sys=True)\n']' returned non-zero exit status 1.
make: *** [install] Error 1
"BUILD FAILED"、"Error"、、エラーが出ましたね。

"BUILD FAILED (OS X 11.1 using python-build 20180424)"というキーワードで調べたら、"xcode-select --install"を実行すれば解決できるかもという情報があったので試してみます。

$ xcode-select --install
xcode-select: error: command line tools are already installed, use "Software Update" to install updates
私の環境には既にXcodeは入っているので、これは関係なさそうです。

次に、SpotlightでXcode.appを起動しようとすると、下の画像のようなメッセージが出ました。

Xcode.app起動時メッセージ

ここはInstallボタンを押してみます。そうしたら数分でXcodeアプリが起動しました。

Xcodeが起動したらPreferences(設定画面)を開いて(メニューバーのXcode->Preferences、ショートカットで開くなら"command + ,")、Locationタブを選択します。

Xcode.appの設定画面のCommand Line Tools

Command Line Toolsが空欄になっているので、"Xcode 12.3(12C33)"を選択します(この時パスワードを求められる)。
(*"Xcode 12.3(12C33)"しか選択できなかった。)

ここで再度pyenvでpython3.9.0をインストールしてみます。

$ pyenv install 3.9.0
python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.9.0.tar.xz...
-> https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tar.xz
Installing Python-3.9.0...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk

BUILD FAILED (OS X 11.1 using python-build 20180424)

Inspect or clean up the working tree at /var/folders/f7/y7pppkwj25l9xs59z2h2z9sh0000gp/T/python-build.20210109185325.19063
Results logged to /var/folders/f7/y7pppkwj25l9xs59z2h2z9sh0000gp/T/python-build.20210109185325.19063.log

Last 10 log lines:
〜
〜
make: *** [install] Error 1
ダメですね。同じエラーメッセージです。

今度は下のサイトを参考にして、LDFLAGSという環境変数を指定しながらインストールします。
pyenvでpythonのビルドに失敗する(MacOS / Big Sur)

$ LDFLAGS="-L$(xcrun --show-sdk-path)/usr/lib" pyenv install 3.9.0
python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.9.0.tar.xz...
-> https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tar.xz
Installing Python-3.9.0...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
Installed Python-3.9.0 to /Users/〇〇/.pyenv/versions/3.9.0
できました!

そういえばHomebrewでpyenvをインストールした時に、LDFLAGSについて少しメッセージありましたね。この時は問題なくインストールできたのでメッセージの詳細を見ていなかったけど、見ていたらpythonインストール時の事について書いてあったかもしれません。

ちなみに"xcrun --show-sdk-path"は選択中のSDKのパスを示してくれるらしく、実行した結果は下の通りでした。

 $ xcrun --show-sdk-path
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk

これでPython3.9.0をインストールできたはずなので、確認します。

$ pyenv versions
  system
* 3.5.1 (set by /Users/〇〇/.pyenv/version)
  3.9.0

$ pyenv version
3.5.1 (set by /Users/〇〇/.pyenv/version)
3.9.0がインストールされた事を確認できましたが、今選択しているバージョンは3.5.1のままなので、"pyenv global"で3.9.0に切り替えます。
$ pyenv global 3.9.0

$ pyenv versions
  system
  3.5.1
* 3.9.0 (set by /Users/〇〇/.pyenv/version)

$ python -V
Python 3.9.0

$ python3 -V
Python 3.9.0

$ pip -V
pip 20.2.3 from /Users/〇〇/.pyenv/versions/3.9.0/lib/python3.9/site-packages/pip (python 3.9)

$ pip3 -V
pip 20.2.3 from /Users/〇〇/.pyenv/versions/3.9.0/lib/python3.9/site-packages/pip (python 3.9)
3.9.0に切り替えてpythonのバージョンを確認したら3.9.0になっていました!

これでpyenv + pythonの最新版の環境を作るという当初の目的を達成する事ができました。

Pythonをインタラクティブモード(対話モード)で使ってみる。IDLEも。動作確認

せっかくPythonをインストールしたので、インタラクティブモード(対話モード)で少し使ってみます。
インタラクティブモードにはpythonコマンドで入れます。

$ python
Python 3.9.0 (default, Jan  9 2021, 22:05:52) 
[Clang 12.0.0 (clang-1200.0.32.28)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 
簡単な計算をしたり、文字列を表示したり、カレンダーを表示してみます。
$ python
Python 3.9.0 (default, Jan  9 2021, 22:05:52) 
[Clang 12.0.0 (clang-1200.0.32.28)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> #計算してみる
>>> 100 + 10 * 3
130
>>> #文字列を表示する
>>> print("Hello World")
Hello World
>>> #カレンダーを表示する
>>> import calendar
>>> print(calendar.month(2021, 1))
    January 2021
Mo Tu We Th Fr Sa Su
             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

>>> #終了する
>>> quit()
~ $ 
問題なさそうです。インタラクティブモードから抜ける時は、"quit()"と入力するか、ショートカット"Ctrl + D"でできます。

また、pyenvをインストールする事でIDLEも使えます。ターミナルでidleコマンドを実行すれば、IDLEが起動します。

pyenvのIDLEを起動(macOS)

その他、pyenvについて色々

その他のpyenvについてのメモ書きです。

pyenvでインストールした各pythonは以下のディレクトリにあります。

$ ls ~/.pyenv/versions
3.5.1 3.9.0
$ #pyenvのルートパス表示
$ pyenv root
/Users/〇〇/.pyenv

$ #Homebrewでpvenvのアップグレードをしたい時
$ brew upgrade pyenv

$ #pyenvのヘルプ表示
$ pyenv --help
Usage: pyenv  []

Some useful pyenv commands are:
   --version   Display the version of pyenv
   commands    List all available pyenv commands
   exec        Run an executable with the selected Python version
   global      Set or show the global Python version(s)
   help        Display help for a command
   hooks       List hook scripts for a given pyenv command
   init        Configure the shell environment for pyenv
   install     Install a Python version using python-build
   local       Set or show the local application-specific Python version(s)
   prefix      Display prefix for a Python version
   rehash      Rehash pyenv shims (run this after installing executables)
   root        Display the root directory where versions and shims are kept
   shell       Set or show the shell-specific Python version
   shims       List existing pyenv shims
   uninstall   Uninstall a specific Python version
   version     Show the current Python version(s) and its origin
   version-file   Detect the file that sets the current pyenv version
   version-name   Show the current Python version
   version-origin   Explain how the current Python version is set
   versions    List all Python versions available to pyenv
   whence      List all Python versions that contain the given executable
   which       Display the full path to an executable

See `pyenv help ' for information on a specific command.
For full documentation, see: https://github.com/pyenv/pyenv#readme

最後に、venvでPythonの仮想環境を作る

所々で詰まりましたが、なんとかpyenvで最新版のPython3.9.0をインストールして使えるようになりました。

最初にも話しましたが、やはり一連の作業をやってみて、これはちょっとコマンド操作やプログラミング自体が初めての初心者の域を超えているな、とも感じました。自分の環境にPythonの最新バージョンを用意したいなら、素直にインストーラでPythonをインストールした方が良さそうですね。

あと、今回pyenvを使うことでPythonのバージョンを切り替える事ができるようになりましたが、Pythonのvenvという機能を使えば、Pythonの仮想環境を作成し、仮想環境毎にpipで管理するパッケージを分ける事ができるようになります。

venvについては別ページで説明していますので、そちらを参考にしてみてください。
venvでPythonの仮想環境を試してみる