【问题标题】:Problems installing python 3.6 with pyenv on Mac OS Big Sur在 Mac OS Big Sur 上使用 pyenv 安装 python 3.6 时出现问题
【发布时间】:2021-03-04 20:11:59
【问题描述】:

在我的 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....

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

conda install -c deezer-research spleeter 

【问题讨论】:

  • github.com/pyenv/pyenv/issues/1740 好像和你的3.6问题一样
  • 你看过asdf吗? asdf-vm.com 这是个人喜好,但我发现它是解决 Python 版本控制问题的最简单方法。
  • @Everett asdf 很棒,但它在后台使用了pyenv,所以这个线程对于这两个工具都是真实的。

标签: python


【解决方案1】:

感谢乔丹, 解决方案是关注https://github.com/pyenv/pyenv/issues/1740#issuecomment-738749988

brew reinstall zlib bzip2

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

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

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

nano ~/.zshrc or nano ~/.bashrc

并添加:

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"

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

. ~/.zshrc or . ~/.bashrc

然后运行下面的命令进行安装(将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)

【讨论】:

  • 我确认它适用于 MacOS Big Sur (11.2.3) 上的 pyenv 1.2.26 的 Python 3.6.13。 (实际上,我跳过了sudo rm -rf /Library/Developer/CommandLineToolsxcode-select --install,但其余的都跟着)
  • 这不适用于带有 Big Sur 11.2.2 的 Mac M1。
  • 适用于 python 3.5.10 MacOs 11.2
  • 它对我有用,python 3.8.0 - MacOs 11.2.1
  • 大约四年前我一直在使用 Intel Mac,并且在操作系统更新后我通常会收到这样的错误。几乎每次:sudo rm -rf /Library/Developer/CommandLineTools &amp;&amp; xcode-select --install 解决了这个问题。这是因为 CommandLineTools 没有正确更新。
【解决方案2】:

据此: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)

【讨论】:

  • 感谢您向其他人提炼此内容:这是正确的答案
  • 另外,如果您使用的是 Apple Silicon (M1),请在安装命令前加上 arch -x86_64,否则会失败并显示为 configure: error: Unexpected output of 'arch' on OSX
  • 这对我在 bigsur 11.6 上使用 python 3.6.14 有效。非常感谢
  • 这在 Intel mac 上终于为我工作了 12.0.1 Monterey。
  • 这修复了在 macOS 11.5.2 (Big Sur) 上安装 Python 3.7.2。
【解决方案3】:

以下步骤终于适用于我的 MacBook Air M1Big Sur 11.6

‼️ 请注意,此说明适用于 Rosetta 2 模拟 x86 终端。

  1. 安装 brew:

    arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
    
  2. 安装推荐的依赖:

    arch -x86_64 brew install openssl readline sqlite3 xz zlib
    
  3. 使用 brew 安装 Pyenv:

    arch -x86_64 brew install pyenv
    
  4. 配置你的shell环境(在我的例子中是zsh):

    echo 'eval "$(/usr/local/bin/brew shellenv)"' >> ~/.zshrc
    
  5. 重启终端。

  6. 添加环境变量(在我的例子中,问题在于 zlib 和 openssl):

    export LDFLAGS="-L/usr/local/opt/zlib/lib"
    export CPPFLAGS="-I/usr/local/opt/zlib/include"
    export LDFLAGS="-L/usr/local/opt/openssl@3/lib"
    export CPPFLAGS="-I/usr/local/opt/openssl@3/include"
    
  7. 使用补丁安装所需的 Python 版本:

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

    pyenv shell 3.6.15
    
  9. 查看当前使用的 Python 版本:

    pyenv which python3
    

【讨论】:

    【解决方案4】:

    Jacob Anderson 的回答是对的,但值得注意的是,没有必要执行危险的步骤:

    sudo rm -rf /Library/Developer/CommandLineTools 
    

    事情对我有用(在 MacOS 11.4 上安装了 Python 3.6.0)而没有这样做。感谢雅各布!

    【讨论】:

      【解决方案5】:
      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)
      

      它适用于 MacOs 11.2.2

      【讨论】:

        【解决方案6】:

        我在 mu ubuntu 机器上遇到了这个问题,我卸载了 Brew 并从源代码重新安装了 pyenv。它对我有用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-03-19
          • 2021-08-12
          • 2021-04-07
          • 1970-01-01
          • 1970-01-01
          • 2021-04-17
          • 2019-04-27
          • 1970-01-01
          相关资源
          最近更新 更多