2021/8/7現在、Pythonの最新安定版は3.9.6のよう。
元々pyenvで3.8.3を入れていたが、これを一度uninstallしてinstallし直そうとしたら以下エラー。
$ pyenv isntall 3.9.6
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
BUILD FAILED (OS X 11.4 using python-build 2.0.4-8-gd209e061)
ググると Xcode Command Line Tools が最新のMacOS 11.4に対応していないことによるエラーっぽい。ただ.bashrc
や.bash_profile
のPATHを追記とか、個人的によくわかってない対策が多く戸惑ったので備忘録。
追記
色々調べているとPATHを通す関係は.bash_profile
に書いている人がすごく多かったので、これ以降こっちに統一して書くようになった。
##ポイント
- 多くはM1(Apple Silicon, arm64)にHomebrewやPython, pyenvなどが対応してないことが原因っぽかった
- bashのPATHがきちんと通ってないことが多い
- M1に対応させるため
LDFLAGS
やCPPFLAGS
などの個別のパス指定?も重要 - 一回Homebrewを再インストールしといた方がいいかな
-
brew doctor
のWarningはやはり無視しない方がいいっぽい - pyenvでM1対応のバージョンは3.9.1からなので注意
- brew install するときは公式のGitHubのREADMEをみたがいい
- やっぱりbrewとは、bash_profileとは、$PATHとはみたいな「これはどういうもので、何をやっている記述なのか」を面倒でも理解しながら色々試すのが遠回りなようで近道な気がする
このteratailのquickquipさんの回答を先にみておくと理解が早いかも。
ググって上位に出てくるこのGitHub Issueは「Ubuntuでの解決法」という前提条件がちゃんと書いてあるのでMacではお門違いなので注意。
やったこと
Xcode13 beta のインストールと Command Line Tools への適用
最新の Xcode13 beta を入れて、設定>Loacationsの Command Line Tools を最新にするとコンソールに出力されるラスト10行のエラー文が変わった。
そしてpyenv install 3.9.6
したら、cpythonのImport時にsymbolが見つからないよ的なエラー。ただあとになって思えばこれは本質的な原因ではなかったと思う。
Last 10 log lines:
from . import _common
File "/private/var/folders/j0/tj3vwrjs3nd_m_h3nfx1q_fm0000gn/T/python-build.20210807200735.65636/Python-3.9.1/Lib/importlib/_common.py", line 3, in <module>
import zipfile
File "/private/var/folders/j0/tj3vwrjs3nd_m_h3nfx1q_fm0000gn/T/python-build.20210807200735.65636/Python-3.9.1/Lib/zipfile.py", line 6, in <module>
import binascii
ImportError: dlopen(/private/var/folders/j0/tj3vwrjs3nd_m_h3nfx1q_fm0000gn/T/python-build.20210807200735.65636/Python-3.9.1/build/lib.macosx-11.4-arm64-3.9/binascii.cpython-39-darwin.so, 2): Symbol not found: _crc32
Referenced from: /private/var/folders/j0/tj3vwrjs3nd_m_h3nfx1q_fm0000gn/T/python-build.20210807200735.65636/Python-3.9.1/build/lib.macosx-11.4-arm64-3.9/binascii.cpython-39-darwin.so
Expected in: flat namespace
in /private/var/folders/j0/tj3vwrjs3nd_m_h3nfx1q_fm0000gn/T/python-build.20210807200735.65636/Python-3.9.1/build/lib.macosx-11.4-arm64-3.9/binascii.cpython-39-darwin.so
make: *** [install] Error 1
.bash_profile, .bashrc
色々ググりながらbash_profileとbashrcをいじって最終的にこうなった。
if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fi
##
# Your previous /Users/takuya/.bash_profile file was backed up as /Users/takuya/.bash_profile.macports-saved_2019-06-24_at_17:30:49
##
# MacPorts Installer addition on 2019-06-24_at_17:30:49: 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.
export PS1='\[\e[33m\]\u:\W\[\e[0m\]$ ';
export PATH="/usr/local/bin:$PATH"
# homebrew: mac os package manager
eval "$(/opt/homebrew/bin/brew shellenv)"
## readline
export LDFLAGS="-L/opt/homebrew/opt/readline/lib" # あとから追記したもの
export CPPFLAGS="-I/opt/homebrew/opt/readline/include" # あとから追記したもの
export PKG_CONFIG_PATH="/opt/homebrew/opt/readline/lib/pkgconfig" # あとから追記したもの
# nodebrew: node.js package manager
export PATH=$PATH:$HOME/.nodebrew/current/bin
# rbenv
export PATH="~/.rbenv/shims:/usr/local/bin:$PATH"
eval "$(rbenv init -)"
# pyenv
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"
# flutter
export PATH="$PATH:$HOME/flutter/bin"
そしてpyenv install 3.9.6
するとこういうエラーに行き着いた。
Installing Python-3.9.6...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
WARNING: The Python readline extension was not compiled. Missing the GNU readline lib?
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?
Please consult to the Wiki page to fix the problem.
https://github.com/pyenv/pyenv/wiki/Common-build-problems
BUILD FAILED (OS X 11.4 using python-build 2.0.4-8-gd209e061)
Inspect or clean up the working tree at /var/folders/j0/tj3vwrjs3nd_m_h3nfx1q_fm0000gn/T/python-build.20210808110538.61673
Results logged to /var/folders/j0/tj3vwrjs3nd_m_h3nfx1q_fm0000gn/T/python-build.20210808110538.61673.log
Last 10 log lines:
$ensurepip --root=/ ; \
fi
Looking in links: /var/folders/j0/tj3vwrjs3nd_m_h3nfx1q_fm0000gn/T/tmp4vr3drqh
Processing /private/var/folders/j0/tj3vwrjs3nd_m_h3nfx1q_fm0000gn/T/tmp4vr3drqh/setuptools-56.0.0-py3-none-any.whl
Processing /private/var/folders/j0/tj3vwrjs3nd_m_h3nfx1q_fm0000gn/T/tmp4vr3drqh/pip-21.1.3-py3-none-any.whl
Installing collected packages: setuptools, pip
WARNING: The scripts pip3 and pip3.9 are installed in '/Users/takuya/.pyenv/versions/3.9.6/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
NOTE: The current PATH contains path(s) starting with `~`, which may not be expanded by all applications.
Successfully installed pip-21.1.3 setuptools-56.0.0
ラスト10行よりも上の方のThe Python readline extension was not compiled. Missing the GNU readline lib?
のWarningやErrorがまず気になった。
brew install readline
間違ってbrew install read-line
をしてしまってNo previously deleted formula found
というErrorがでたのでHomebrew自体の再インストールやエラー解消をまずやった(結果的に不要だったかも)。
homebrewの再インストール
brew doctor 時のWarning解消
そうではなくbrew install readline
としてやると上手く行ったようだが、以下のように「コンパイラがreadlineを見つけるようにするためには以下を設定しろ」との指示が。
readline is keg-only, which means it was not symlinked into /opt/homebrew,
because macOS provides BSD libedit.
For compilers to find readline you may need to set:
export LDFLAGS="-L/opt/homebrew/opt/readline/lib"
export CPPFLAGS="-I/opt/homebrew/opt/readline/include"
For pkg-config to find readline you may need to set:
export PKG_CONFIG_PATH="/opt/homebrew/opt/readline/lib/pkgconfig"
==> Summary
🍺 /opt/homebrew/Cellar/readline/8.1: 48 files, 1.7MB
keg-only: Cellar だけにインストールされ、/usr/local にはリンクされていない formula のこと。
https://qiita.com/halo57/items/e7511f3befbcb9fedd6a
なので.bash_profile
に上記export3つを追記した。(source .bash_profile
が何故か効かないのでターミナルを再起動した)
成功!
その上でpyenv install 3.9.6
したら成功した!
$ pyenv install 3.9.6
$ pyenv 3.9.6
$ pyenv global 3.9.6
pyenvのglobalの使い方ってこれであってるっけ。。?ちなみに3.9.1以降じゃないとpyenvがM1チップに対応してないらしくインストールは出来ないので注意。
最終的な環境
$ python -v
WARNING: Python 2.7 is not recommended.
Python 2.7.16 (default, May 8 2021, 11:48:02)
$ python3 -v
Python 3.9.6 (default, Jun 29 2021, 05:25:02)
$ pyenv -v
pyenv 2.0.4-8-gd209e061
$ pyenv versions
system
3.6.10
3.7.0
* 3.9.6 (set by /Users/takuya/.pyenv/version)
$ openssl version
OpenSSL 1.1.1k 25 Mar 2021
元々の .bash_profile, .bashrc
ぐちゃぐちゃでした。。
if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fi
##
# Your previous /Users/takuya/.bash_profile file was backed up as /Users/takuya/.bash_profile.macports-saved_2019-06-24_at_17:30:49
##
# MacPorts Installer addition on 2019-06-24_at_17:30:49: adding an appropriate PATH variable for use with MacPorts.
# export PATH="/opt/local/bin:/opt/local/sbin:$PATH"
export PATH="~/.rbenv/shims:/usr/local/bin:$PATH"
# Finished adapting your PATH environment variable for use with MacPorts.
export PS1='\[\e[33m\]\u:\W\[\e[0m\]$ ';
eval "$(rbenv init -)"
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"
# Setting PATH for Flutter
export PATH="$PATH:$HOME/flutter/bin"
export PATH=$PATH:/Users/takuya/.nodebrew/current/bin
export PATH="$HOME/.pyenv/bin:$PATH"
export PATH="/usr/local/bin:$PATH"
.bashrcやPATHを通すことへの理解はこちら
気になったこと
WARNING: The scripts pip, pip3 and pip3.8 are installed in '(それぞれ任意のパス)' which is not on PATH.
というエラーが出ていたがいつの間にか出なくなっていた。
source .bashrc
, source .bash_profile
をやってもecho $PATH
で出力されるPATHが変わらなかったり重複している。Cmd+Qでターミナルを再起動したらちゃんとなったけど。
「.bash_profileが(ターミナルに?)ログイン時に1回だけ呼ばれるのに対し、.bashrcは(新しいターミナルウィンドウを?)起動する度に呼ばれる」的なことが書いていたので、.bash_profileが上位ということで、なんとなくhomebrew系は.bash_profile
い、env系は.bashrcに書いてみました。
MacportsというのはHomebrewと並ぶMacOSパッケージ管理ソフトでHomebrewより古くからあるらしい。PS1
というのはターミナルの$
の左に出るユーザー名やPC名、パス名をカスタマイズしたものなので今回は関係ないです。eval
というのはよくわからん。
やってダメだったこと
# CommandLineToolsを入れ直してもダメ
sudo rm -rf /Library/Developer/CommandLineTools
xcode-select --install
# 11.4のpackageなんてねぇよと怒られた
sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_11.4.pkg -target /
これの対応方法②
arch を x86_64 でインストール?
pyenvがM1 Mac(Appleシリコン)に対応してないのでx86_64でインストール?するも、pyenv install
はやはりダメ
arch -arch x86_64 env PATH=${PATH/\/opt\/homebrew\/bin:/} pyenv install 3.8.7
zshrcにPATHの追記
export PATH="$HOME/.pyenv/bin:$PATH"
export PATH="/usr/local/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
export LDFLAGS="-L/usr/local/opt/zlib/lib -L/usr/local/opt/bzip2/lib"
export CPPFLAGS="-I/usr/local/opt/zlib/include -I/usr/local/opt/bzip2/include"
自分の場合はecho $SHELL
で確認するとzshでなくbashを使っていたので、.bashrc
に書いてみたがダメだった。。
pyenvのこのIssue
sudo yum install readline-devel
はEC2でのコマンドか?
余談
- M1 Macに移行した時に移行アシスタントでやったけどpyenvやrbenv、Homebrewなどは1からやったほうがよかったのかなぁ
- M1 Macからemacs入ってないのでVimのコマンド操作を覚えながらやったけどMac標準のCtrl+k/Ctrl+yとか使えない(Vimだとdd/p)のが辛かったけどそれ以上の魅力がやはりあるのかな
他に参考になりそうなサイト
pyenv common build problem on github
https://github.com/pyenv/pyenv/wiki/Common-build-problems
M1 Mac でのHomebrew管理
https://zenn.dev/junjunjunk/articles/4b230519d87de4
brew tap
https://qiita.com/saa/items/85ed5e914d424fbf9fd6
homebrew readline7
https://qiita.com/Cj-bc/items/34bc4ef139844d031f27