ネット上でまとまった日本語の記事を見つけられなかったので、今後同じ過ちを繰り返さないため&同じ事態に遭遇して挫折している方の手助けになればと思い作成しました!
要約
- 開発PCのMacのCPUがX86_64である。
- homebrewを使用している。
- pyenvでPython3.11, 3.12をインストールできない。
- pyenvインストール時にXCodeのCLangではなくGCCを使用したためにエラーが発生している。
- つまりPATHをいじれば良い。
はじめに
今回MacにpyenvでPython3.11, 3.12をインストールできない状態になったのでそれを解決した方法を記事にします。
Macユーザーで開発されている方もおられると思いますが、Mac購入時にCPUまで気にされる方は多くないのではないでしょうか?
実は重要な内容だったりします。
今回のPythonがインストールできない原因はCPU依存だったのです。
環境について
まず僕のMac環境からです。
- CLIはzshでbrewで各種ツールをインストール。
- direnv、poetryでPythonの環境をアプリごとに設定。
そのためPythonはpyenvでバージョン管理しています。
その他機器情報はこちら
$ uname -a
Darwin C02XXXXXXXXX.local 23.4.0 Darwin Kernel Version 23.4.0: Fri Mar 15 00:11:05 PDT 2024; root:xnu-10063.101.17~1/RELEASE_X86_64 x86_64
エラー内容について
ではエラー内容から共有したいと思います。
python3.11系
$ pyenv install 3.11.7
python-build: use openssl@3 from homebrew
python-build: use readline from homebrew
Downloading Python-3.11.7.tar.xz...
-> https://www.python.org/ftp/python/3.11.7/Python-3.11.7.tar.xz
Installing Python-3.11.7...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
BUILD FAILED (OS X 14.4.1 using python-build 20180424)
Inspect or clean up the working tree at /var/folders/j8/bmcn3vgd5r52cjzc6bthwsfc0000gn/T/python-build.20240517152930.75902
Results logged to /var/folders/j8/bmcn3vgd5r52cjzc6bthwsfc0000gn/T/python-build.20240517152930.75902.log
Last 10 log lines:
File "/private/var/folders/j8/bmcn3vgd5r52cjzc6bthwsfc0000gn/T/python-build.20240517152930.75902/Python-3.11.7/Lib/ensurepip/__init__.py", line 202, in _bootstrap
return _run_pip([*args, *_PACKAGE_NAMES], additional_paths)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/private/var/folders/j8/bmcn3vgd5r52cjzc6bthwsfc0000gn/T/python-build.20240517152930.75902/Python-3.11.7/Lib/ensurepip/__init__.py", line 103, in _run_pip
return subprocess.run(cmd, check=True).returncode
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/private/var/folders/j8/bmcn3vgd5r52cjzc6bthwsfc0000gn/T/python-build.20240517152930.75902/Python-3.11.7/Lib/subprocess.py", line 571, in run
raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '['/private/var/folders/j8/bmcn3vgd5r52cjzc6bthwsfc0000gn/T/python-build.20240517152930.75902/Python-3.11.7/python.exe', '-W', 'ignore::DeprecationWarning', '-c', '\nimport runpy\nimport sys\nsys.path = [\'/var/folders/j8/bmcn3vgd5r52cjzc6bthwsfc0000gn/T/tmpj1acatgf/setuptools-65.5.0-py3-none-any.whl\', \'/var/folders/j8/bmcn3vgd5r52cjzc6bthwsfc0000gn/T/tmpj1acatgf/pip-23.2.1-py3-none-any.whl\'] + sys.path\nsys.argv[1:] = [\'install\', \'--no-cache-dir\', \'--no-index\', \'--find-links\', \'/var/folders/j8/bmcn3vgd5r52cjzc6bthwsfc0000gn/T/tmpj1acatgf\', \'--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
python3.12系
$ pyenv install 3.12.1
python-build: use openssl@3 from homebrew
python-build: use readline from homebrew
Downloading Python-3.12.1.tar.xz...
-> https://www.python.org/ftp/python/3.12.1/Python-3.12.1.tar.xz
Installing Python-3.12.1...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
BUILD FAILED (OS X 14.4.1 using python-build 20180424)
Inspect or clean up the working tree at /var/folders/j8/bmcn3vgd5r52cjzc6bthwsfc0000gn/T/python-build.20240517153750.97226
Results logged to /var/folders/j8/bmcn3vgd5r52cjzc6bthwsfc0000gn/T/python-build.20240517153750.97226.log
Last 10 log lines:
ld: warning: search path '/Users/john/.pyenv/versions/3.12.1/lib' not found
ld: warning: search path '/Users/john/.pyenv/versions/3.12.1/lib' not found
clang -bundle -undefined dynamic_lookup -L/usr/local/opt/readline/lib -L/usr/local/opt/readline/lib -L/Users/john/.pyenv/versions/3.12.1/lib -Wl,-rpath,/Users/john/.pyenv/versions/3.12.1/lib -L/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/readline/lib -L/Users/john/.pyenv/versions/3.12.1/lib -Wl,-rpath,/Users/john/.pyenv/versions/3.12.1/lib -L/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib Modules/_testclinic.o -o Modules/_testclinic.cpython-312-darwin.so
ld: archive member '/' not a mach-o file in '/private/var/folders/j8/bmcn3vgd5r52cjzc6bthwsfc0000gn/T/python-build.20240517153750.97226/Python-3.12.1/Modules/_hacl/libHacl_Hash_SHA2.a'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [Modules/_sha2.cpython-312-darwin.so] Error 1
make: *** Waiting for unfinished jobs....
ld: warning: duplicate -rpath '/Users/john/.pyenv/versions/3.12.1/lib' ignored
ld: warning: search path '/Users/john/.pyenv/versions/3.12.1/lib' not found
ld: warning: search path '/Users/john/.pyenv/versions/3.12.1/lib' not found
- python3.11系のエラーは「subprocess」でエラーが起きているようだが、ぱっと見わけわかめだ。
- python3.12系のエラーはなぜかインストールに必要なデータがあってほしいディレクトリにない。こちらもわけわかめだ。
- 最大のヒントはpythonのビルド時にxcodeのsdkをしようしていることです。そしてCPUがARM64のMacではこの現象が発生しないことです。
解決方法
PATHから邪魔をしているパスを取り除くとインストール可能です。
※MacのCPUがX86_64の場合です。
※コマンド実行ディレクトリなどマスクしてますので適宜変更して実行してください。
取り除くパスは下記になります。
PATH: /opt/homebrew/opt/make/libexec/gnubin/
PATH: /opt/homebrew/opt/coreutils/libexec/gnubin/
PATH: /opt/homebrew/opt/binutils/bin/
# CPU確認
$ uname -m
x86_64
# pathを取得
$ echo $PATH
# 取得したパスから不要なものを取り出しpathに詰める
PATH=[上記のパスから不要なものを取り除いたもの]
※環境のパスは書き換えないこと
※そうすることでベースのパスを汚さずに同一ターミナル内のみ有効になります。
この対応をすることでインストールできるようになったかと思います。
$ pyenv versions
system
3.10.12
3.10.13
* 3.11.8 (set by /Users/john/work/.python-version)
3.12.2
参考文献
※OSX Sonoma (MB Air M2)とありますが、Mac book proでも発生したのであまり関係ない気がします。