LoginSignup
27
21

More than 3 years have passed since last update.

【macOS Big Sur】pyenv経由で古いpythonをインストールする

Posted at

概要

macOS Big Sur上で、pyenvで古いpython(今回は3.7以下)のインストールに失敗したので、解決のためにやったことをまとめました。
日本語では、3.7以下の古いバージョンのインストールに失敗するケースについてはあまり情報がなかったので、まとめてみました。

環境

macOS Big Sur バージョン11.1
pyenv 1.2.22 (brewでインストール)

pyenvのバージョンの確認方法は下記

pyenv --version

背景

macOS Big Sur上で、pyenvで古いpythonをインストールしようとすると下記のエラーがでて失敗しました。どうも3.8、3.9のインストールはできるのですが、3.7以下は失敗するようです。

% pyenv install 3.6.0
python-build: use openssl from homebrew
python-build: use readline from homebrew
Downloading Python-3.6.0.tar.xz...
-> https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tar.xz
Installing Python-3.6.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/qz/d2c_grsx75x9b2k6ddzdzm400000gn/T/python-build.20210207175025.47712
Results logged to /var/folders/qz/d2c_grsx75x9b2k6ddzdzm400000gn/T/python-build.20210207175025.47712.log

Last 10 log lines:
./Modules/posixmodule.c:8146:15: error: implicit declaration of function 'sendfile' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
        ret = sendfile(in, out, offset, &sbytes, &sf, flags);
              ^
./Modules/posixmodule.c:10340:5: warning: code will never be executed [-Wunreachable-code]
    Py_FatalError("abort() called from Python code didn't abort!");
    ^~~~~~~~~~~~~
clang -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include   -I/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include   -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers   -I. -I./Include -I/usr/local/opt/readline/include -I/usr/local/opt/readline/include -I/usr/local/opt/openssl@1.1/include -I/Users/jiro/.pyenv/versions/3.6.0/include  -I/usr/local/opt/readline/include -I/usr/local/opt/readline/include -I/usr/local/opt/openssl@1.1/include -I/Users/jiro/.pyenv/versions/3.6.0/include   -DPy_BUILD_CORE  -c ./Modules/_sre.c -o Modules/_sre.o
1 warning and 1 error generated.
make: *** [Modules/posixmodule.o] Error 1
make: *** Waiting for unfinished jobs....

解決方法

軽く検索してみると、macOS Big Surでpyenv installに失敗することはよく起こっているようで、その対策もいろいろ議論されていました。日本語だとxcodeコマンドラインツールを最新のものにする方法(macOS Big Sur で pyenv Python インストールできない場合など)がよく出てくるのですが、僕の環境ではそれでは解決しませんでした。

最終的に下記の投稿の方法で解決できました。
https://github.com/pyenv/pyenv/issues/1643#issuecomment-755067511

このissue自体はmacOS Big Surでpython3.8のビルドに失敗するという質問から始まっているのですが、途中で3.5がインストールできないという話が出てきて、最終的にリンク先のcommentでそれぞれのバージョンにおける方法が解決方法が示されます。コマンドを以下に引用します。

ライブラリのインストール

(詳細は理解できていませんが、どうもこれらのライブラリが古いためにpythonのbuildができない可能性があるようです。)

brew install zlib
brew install sqlite
brew install bzip2
brew install libiconv
brew install libzip

Pythonインストール

3.4, 3.5, 3.6のインストール

LDFLAGS="-L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib" pyenv install --patch 3.4.10 < <(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch\?full_index\=1)

LDFLAGS="-L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib" pyenv install --patch 3.5.10 < <(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch\?full_index\=1)

LDFLAGS="-L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib" pyenv install --patch 3.6.12 < <(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch\?full_index\=1)

3.7かそれ以上のインストール(僕の環境では3.8.6と3.9.0に関してはpyenv install x.x.xだけでインストールできました)

LDFLAGS="-L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib" pyenv install 3.7.9

LDFLAGS="-L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib" pyenv install 3.8.6

LDFLAGS="-L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib" pyenv install 3.9.0

備考

上記のissueに辿り着く前にxcodeコマンドラインツールやpyenvの再インストールも試していました。ひょっとしたら上記で解決できたことに影響を与えているかもしれませんので一応記しておきます。

xcodeコマンドラインツールの再インストール

sudo rm -rf /Library/Developer/CommandLineTools
xcode-select --install 

pyenvの再インストール

注:pyenv-virtualenvなどを使用している人はそれも合わせて再インストールしたほうがよいかもしれません。不安な方は自分でやり方を調べてから実行お願いします。

brew uninstall pyenv
brew install pyenv

おわりに

macOS Big Surでpythonインストールに失敗する現象はどうもあるあるのようです(気軽にアップデートするんじゃなかった、、、)
日本語だと3.8とか3.9のインストールに失敗したという報告とその解決方法はいくつかでてきたのですが、古いバージョンのインストールについてはあまり情報がなく、英語のissueをあたってようやく解決できました。
本記事がなにかの役に立つと幸いです。

27
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
21