ぶろとよ

ネットワーク系クラウドエンジニア(AWS)の技術ブログ。自動化に興味があるためAWS CLIを勉強&アウトプット中。

macOSでPython環境構築 前編:pyenvで複数バージョンのPythonをインストールする

Windowsメインで使用しているけれどmacOSの勉強中です。
macOSでPython環境を構築したので備忘的なメモを残します。

venvでの仮想環境は少し時間が立つと何の環境を作ったのか忘れるので、コマンド実行すると環境を選択できるように作ってみました(汗

macOSでPython環境構築

  • 前編:pyenvで複数バージョンのPythonをインストールする
    • 本記事です
  • 後編:venvでPython仮想環境を作成する

目次

検証環境

  • 検証日: 2024/01/31
  • 実行環境
    • PC
      • Mac mini M2チップ 2023
      • macOS Sonoma 14.2.1, Build 23C71
        • zsh 5.9 (x86_64-apple-darwin23.0)
        • Homebrew 4.2.8
        • pyenv 2.3.35
          • Python 3.10.13
          • Python 3.11.7
          • Python 3.12.1

注意事項

  • コマンド内の変数やパラメータやは検証で使用したものを記載しています。ご自身の環境に合わせ、書き換えて使用してください。
  • 個人で検証しているため実行結果に責任は持てません。必ずご自身でも検証してから使用してください。


1. 初期状態でのPythonインストール状態

macOSにPythonが入っているか確認したが、入っていなかった。
ただし、python3 --version のように 3 を付ける元からmacOSに入っているものは使用せず、3が付かないように新規でインストールしていく。
Windowsをメインで使っているため、3が付くことに違和感があるんです。。。 ※3が付かないpythonコマンドは2系用だったみたいだけど、今は廃止されたらしぃ。

python --version
# 実行結果
% python --version
zsh: command not found: python


2. Homebrew:パッケージマネージャー

Homebrewとは?Google Geminiに聞いてみた。

macOS上で様々なソフトウェアを簡単にインストール・アップデート・削除できるパッケージマネージャーです。

主な特徴
- 豊富なパッケージ数: 数千もの公式パッケージと、さらに多くのサードパーティ製パッケージが利用可能
- 使いやすさ: brew installのようなシンプルなコマンドでインストール
- 自動更新: パッケージを最新の状態に保つ
- 依存関係の解決: 必要なライブラリなども自動的にインストール

2.1. Homebrewのインストール

インストールコマンドは公式サイト Homebrew に記載されている。
ただ、Appleシリコン(M1, M2等)はIntel CPUの時とはインストール先が変更されたようなので、自分でPATHを通す必要がある。

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# Appleシリコン(M1, M2等)の場合はパスを通す必要がある。
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zshrc
source ~/.zshrc

2.2. Homebrewのインストール確認

brew --version
# 実行結果
% brew --version
Homebrew 4.2.6


3. pyenv:Pythonのバージョン管理

ツール名 用途
pyenv Pythonのバージョン自体を管理するツール
システムに複数のPythonバージョンを同居させることが可能
venv / virtualenv Pythonの仮想環境を提供するツール
異なるプロジェクトやバージョンのパッケージを分離して管理する目的で使用

3.1. pyenvのインストール

brew install pyenv

3.2. pyenvのインストール確認

pyenv --version
# 実行結果
% pyenv --version
pyenv 2.3.35

3.3. pyenvの初期化の設定を.zshrcファイルに書き込む

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
source ~/.zshrc

3.4. pyenvでインストールできるリストを表示する

# すべて
pyenv install --list
# Pythonの3系だけに絞る
pyenv install --list | grep "^\s*3\."
# Pythonの3.10だけに絞る
pyenv install --list | grep "^\s*3\.10\."
# 実行結果
% pyenv install --list | grep "^\s*3\.10\."
  3.10.0
  3.10.1
  3.10.2
  3.10.3
  3.10.4
  3.10.5
  3.10.6
  3.10.7
  3.10.8
  3.10.9
  3.10.10
  3.10.11
  3.10.12
  3.10.13

3.5. Pythonインストールの前にhomebrewで必要なものを入れる

そのままpyenvでPythonをインストールしたらWARNINGが出た。

# WARNINGが出た時の参考
% pyenv install 3.10.13

python-build: use openssl from homebrew
python-build: use readline from homebrew
Downloading Python-3.10.13.tar.xz...
-> https://www.python.org/ftp/python/3.10.13/Python-3.10.13.tar.xz
Installing Python-3.10.13...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/Users/USERNAME/.pyenv/versions/3.10.13/lib/python3.10/lzma.py", line 27, in <module>
    from _lzma import *
ModuleNotFoundError: No module named '_lzma'
WARNING: The Python lzma extension was not compiled. Missing the lzma lib?
Installed Python-3.10.13 to /Users/USERNAME/.pyenv/versions/3.10.13

調べてみるとlzmaの一部がmacで認識できていないらしい?

参考URL: pyenvでlzmaがない警告 MacOS

対策として、homebrewで必要なものを一気にいれる。lzmaはこの中の xz に相当するらしい。

brew install openssl readline sqlite3 xz zlib tcl-tk

3.6. pyenvでPythonをインストールする

pyenv install 3.10.13
# 実行結果 ※WARNING等が出ないで無事にインストールできた
% pyenv install 3.10.13
python-build: use openssl from homebrew
python-build: use readline from homebrew
Downloading Python-3.10.13.tar.xz...
-> https://www.python.org/ftp/python/3.10.13/Python-3.10.13.tar.xz
Installing Python-3.10.13...
python-build: use tcl-tk from homebrew
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
Installed Python-3.10.13 to /Users/USERNAME/.pyenv/versions/3.10.13

3.7. pyenvでインストールしたPythonを確認する

pyenvでは3.10.13のPythonが入っている。

pyenv versions
# 実行結果
% pyenv versions
* system (set by /Users/USERNAME/.pyenv/version)
  3.10.13

ただ、Pythonコマンドはまだ使えない。

python --version
# 実行結果
% python --version
pyenv: python: command not found

The `python' command exists in these Python versions:
  3.10.13

Note: See 'pyenv help global' for tips on allowing both
      python2 and python3 to be found.

pyenvでシステムが利用するpythonを、インストールしたpythonに変更する必要がある。

3.8. システム全体に適用するPythonバージョンを設定する

pyenvコマンドのglobalまたはlocalコマンドを使用して、Pythonを使用できるようにします。

pyenvコマンドのgloballocalの違い - global - システム全体に適用されるPythonバージョンを設定します。 - local - コマンド実行したディレクトリに適用されるPythonバージョンを設定します。 - サブディレクトリにも適用されます。 - プロジェクト毎にPythonバージョンを分ける場合などに有効。

今回はシステム全体に適用したいため global を選択。

pyenv global 3.10.13
python --version
# 実行結果
% pyenv global 3.10.13

% python --version
Python 3.10.13


3.9. 他のPythonバージョンも入れてみる

現在のPythonバージョンのインストール状況

pyenv versions
# 実行結果
% pyenv versions

  system
* 3.10.13 (set by /Users/USERNAME/.pyenv/version)

バージョン 3.113.12 の最新を確認する。

pyenv install --list | grep "^  3\.11\." | tail -1
pyenv install --list | grep "^  3\.12\." | tail -1
# 実行結果
% pyenv install --list | grep "^  3\.11\." | tail -1

  3.11.7
% pyenv install --list | grep "^  3\.12\." | tail -1

  3.12.1

他バージョンのPythonバージョンをインストールする。

pyenv install 3.11.7
pyenv install 3.12.1

Pythonバージョンのインストール状況

pyenv versions
# 実行結果
% pyenv versions

  system
* 3.10.13 (set by /Users/USERNAME/.pyenv/version)
  3.11.7
  3.12.1

Python 3.12.1 を有効にしてみる。

pyenv global 3.12.1
pyenv versions
python --version
# 実行結果
% pyenv global 3.12.1

% pyenv versions
  system
  3.10.13
  3.11.7
* 3.12.1 (set by /Users/USERNAME/.pyenv/version)
% python --version

Python 3.12.1