在 Mac OS Big Sur 上使用 pyenv 安装 python 3.6 时出现问题

Jac*_*son 25 python

在我的 MacBook Air OS Big Sur 上安装 Python 3.6.13 时,使用命令 pyenv install 3.6.13 我收到此错误:

Installing Python-3.6.13...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk

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

Inspect or clean up the working tree at /var/folders/7j/0qtpb8vs1_s34ynv0f6rrs840000gn/T/python-build.20210304114832.65954
Results logged to /var/folders/7j/0qtpb8vs1_s34ynv0f6rrs840000gn/T/python-build.20210304114832.65954.log

Last 10 log lines:
./Modules/posixmodule.c:8210: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:10432:5: warning: code will never be executed [-Wunreachable-code]
    Py_FatalError("abort() called from Python code didn't abort!");
    ^~~~~~~~~~~~~
1 warning and 1 error generated.
1 warning generated.
make: *** [Modules/posixmodule.o] Error 1
make: *** Waiting for unfinished jobs....
Run Code Online (Sandbox Code Playgroud)

任何有关如何解决此问题或其他解决方法以安装 python 3.6.13 的建议将不胜感激。我目前有 python 3.8,但需要 3.6 才能运行:

conda install -c deezer-research spleeter 
Run Code Online (Sandbox Code Playgroud)

Jac*_*son 43

感谢 jordanm,解决方案是遵循https://github.com/pyenv/pyenv/issues/1740#issuecomment-738749988

brew reinstall zlib bzip2
Run Code Online (Sandbox Code Playgroud)

从人们的评论来看(感谢 Lukasz Czerwinski 和 Alex Veksler),似乎很多人认为下一步是可选的(甚至是危险的)并且宁愿跳过它;不过,如果没有其他工作,值得一试:

sudo rm -rf /Library/Developer/CommandLineTools
xcode-select --install
Run Code Online (Sandbox Code Playgroud)

无论您是否选择跳过最后一步,请继续编辑.zshrc.bashrc使用:

nano ~/.zshrc or nano ~/.bashrc
Run Code Online (Sandbox Code Playgroud)

并添加:

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"
Run Code Online (Sandbox Code Playgroud)

编辑并保存该文件后,运行:

. ~/.zshrc or . ~/.bashrc
Run Code Online (Sandbox Code Playgroud)

然后运行下面的命令进行安装(将3.6.0更改为所需的补丁)

CFLAGS="-I$(brew --prefix openssl)/include -I$(brew --prefix bzip2)/include -I$(brew --prefix readline)/include -I$(xcrun --show-sdk-path)/usr/include" LDFLAGS="-L$(brew --prefix openssl)/lib -L$(brew --prefix readline)/lib -L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib" pyenv install --patch 3.6.0 < <(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch\?full_index\=1)
Run Code Online (Sandbox Code Playgroud)

  • 我确认它适用于 MacOS Big Sur (11.2.3) 上的 Python 3.6.13 for pyenv 1.2.26。(实际上,我跳过了“sudo rm -rf /Library/Developer/CommandLineTools”和“xcode-select --install”,但遵循了其余所有内容) (5认同)
  • 这不适用于装有 Big Sur 11.2.2 的 Mac M1。 (3认同)
  • 它适用于 python 3.6.0 MacOs 11.4 (2认同)
  • 大约四年前,我一直在使用 Intel Mac,在操作系统更新后,我通常会遇到这样的错误。几乎每次: `sudo rm -rf /Library/Developer/CommandLineTools &amp;&amp; xcode-select --install` 都会修复问题。这是因为 CommandLineTools 没有正确更新。 (2认同)
  • 运行以 CFLAGS 开头的命令(如图所示),我收到“错误:Python ssl 扩展未编译”。缺少 OpenSSL lib?`错误。我相信这是因为 `brew --prefix openssl` 命令在 2022 年输出 OpenSSL@3,并且通过更改命令以包含 `brew --prefix openssl@1.1` 而不是在它出现的两个地方,我能够获取 3.6.9 进行安装。 (2认同)

spy*_*r77 8

以下步骤最终适用于我的配备Big Sur 11.6 的MacBook Air M1

\n

\xe2\x80\xbc\xef\xb8\x8f 请注意,此指令适用于 Rosetta 2 模拟 x86 终端。

\n
    \n
  1. 安装酿造:

    \n
    arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"\n
    Run Code Online (Sandbox Code Playgroud)\n
  2. \n
  3. 安装推荐的依赖项:

    \n
    arch -x86_64 brew install openssl readline sqlite3 xz zlib\n
    Run Code Online (Sandbox Code Playgroud)\n
  4. \n
  5. 使用brew 安装 Pyenv:

    \n
    arch -x86_64 brew install pyenv\n
    Run Code Online (Sandbox Code Playgroud)\n
  6. \n
  7. 配置 shell 的环境(在我的例子中是 zsh):

    \n
    echo 'eval "$(/usr/local/bin/brew shellenv)"' >> ~/.zshrc\n
    Run Code Online (Sandbox Code Playgroud)\n
  8. \n
  9. 重新启动终端。

    \n
  10. \n
  11. 添加环境变量(在我的例子中,问题出在 zlib 和 openssl 上):

    \n
    export LDFLAGS="-L/usr/local/opt/zlib/lib"\nexport CPPFLAGS="-I/usr/local/opt/zlib/include"\nexport LDFLAGS="-L/usr/local/opt/openssl@3/lib"\nexport CPPFLAGS="-I/usr/local/opt/openssl@3/include"\n
    Run Code Online (Sandbox Code Playgroud)\n
  12. \n
  13. 使用补丁安装所需的 Python 版本:

    \n
    arch -x86_64 pyenv install --patch 3.6.15 <<(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch\\?full_index\\=1)\n
    Run Code Online (Sandbox Code Playgroud)\n
  14. \n
  15. 将 shell 切换到新的 Python 版本:

    \n
    pyenv shell 3.6.15\n
    Run Code Online (Sandbox Code Playgroud)\n
  16. \n
  17. 查看当前使用的Python版本:

    \n
    pyenv which python3\n
    Run Code Online (Sandbox Code Playgroud)\n
  18. \n
\n


mae*_*ati 5

根据这个:https : //github.com/pyenv/pyenv/issues/1737#issuecomment-731672292这与提交问题有关,以下修复了它。它对我有用。

CFLAGS="-I$(brew --prefix openssl)/include -I$(brew --prefix bzip2)/include -I$(brew --prefix readline)/include -I$(xcrun --show-sdk-path)/usr/include" 

LDFLAGS="-L$(brew --prefix openssl)/lib -L$(brew --prefix readline)/lib -L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib"

pyenv install --patch 3.6.13 < <(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch\?full_index\=1)

Run Code Online (Sandbox Code Playgroud)

  • 感谢您对其他人进行提炼:这是正确的答案 (3认同)