在 macOS Mojave 上用 Python 的 pyenv 安装 3.6.8 时遇到 zlib not available 错误的解决方法

根据 Medium 上这篇文章的分享,用下面的指令可以安装成功。

https://medium.com/[@pimterry](/user/pimterry)/setting-up-pyenv-on-os-x-with-homebrew-56c7541fd331

CFLAGS="-I$(brew --prefix readline)/include -I$(brew --prefix openssl)/include -I$(xcrun --show-sdk-path)/usr/include" \
LDFLAGS="-L$(brew --prefix readline)/lib -L$(brew --prefix openssl)/lib" \
PYTHON_CONFIGURE_OPTS=--enable-unicode=ucs2 \
pyenv install 3.6.8

在 macOS Mojave 上用 Python 的 pyenv 安装 3.6.8 时遇到 zlib not available 错误的解决方法

6 回复

我当时刚好也遇到了,用了另一个方法。我记得我也搜到这个方法,但是在我那里不好用。

xcode-select --install

sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /

参考 https://github.com/pyenv/pyenv/issues/1219
写的笔记记录在这: https://note.siwei.info/jupyter-notes/


在 macOS Mojave 上用 pyenv 安装 Python 3.6.8 时遇到 zlib not available 错误,通常是因为系统缺少必要的头文件或库。Mojave 之后,苹果把系统头文件移到了独立的 SDK 里,没装 Xcode 命令行工具或者没同意许可就容易出这问题。

解决步骤:

  1. 确保 Xcode 命令行工具已安装且许可已接受:

    xcode-select --install
    sudo xcodebuild -license accept
    
  2. 安装 macOS SDK 头文件(关键步骤):

    sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
    

    注意:如果找不到这个 .pkg 文件(某些 Command Line Tools 版本可能不包含),可以尝试跳过这步,直接进行第3步。

  3. 设置编译时的 SDK 路径(如果第2步无效或文件不存在): 在安装 Python 前,设置以下环境变量:

    export CFLAGS="-I$(xcrun --show-sdk-path)/usr/include"
    export LDFLAGS="-L$(xcrun --show-sdk-path)/usr/lib"
    

    然后运行安装命令:

    pyenv install 3.6.8
    
  4. 如果上述方法仍失败,可以尝试使用 pyenv--patch 选项,应用一个已知的补丁来修复 zlib 问题。首先保存以下内容为一个文件,例如 python_3.6.8_zlib_fix.patch

    diff --git a/setup.py b/setup.py
    index 715516b..5c65db7 100644
    --- a/setup.py
    +++ b/setup.py
    @@ -756,6 +756,8 @@ class PyBuildExt(build_ext):
             # libffi first.  We may move this down later.
             exts.append(Extension('_ctypes', ['_ctypes/_ctypes.c',
                                               '_ctypes/callbacks.c',
    +                                          '_ctypes/callproc.c',
    +                                          '_ctypes/stgdict.c',
                                               '_ctypes/cfield.c'],
                                   libraries=dummy_libraries,
                                   include_dirs=['_ctypes'],
    @@ -1520,7 +1522,7 @@ class PyBuildExt(build_ext):
             else:
                 zlib_inc = find_file('zlib.h', [], inc_dirs)
                 if zlib_inc is not None:
    -                zlib_h = zlib_inc[0] + '/zlib.h'
    +                zlib_h = zlib_inc[0]
                     version = '"0.0.0"'
                     version_req = '"1.1.3"'
                     with open(zlib_h) as fp:
    

    然后使用补丁安装:

    pyenv install --patch 3.6.8 < python_3.6.8_zlib_fix.patch
    

一句话总结: 先装好命令行工具并同意许可,再尝试设置 SDK 路径或打补丁。

我也遇到了这个问题,重装了 zlib

brew install zlib

cat >> ~/.zshrc <<EOF
# For compilers to find zlib you may need to set:
export LDFLAGS="${LDFLAGS} -L/usr/local/opt/zlib/lib"
export CPPFLAGS="${CPPFLAGS} -I/usr/local/opt/zlib/include"

# For pkg-config to find zlib you may need to set:
export PKG_CONFIG_PATH="${PKG_CONFIG_PATH} /usr/local/opt/zlib/lib/pkgconfig"
EOF

source ~/.zshrc

好奇 macOS_SDK_headers_for_macOS_10.14 这个是什么东西,上次装完这个,重启系统就挂了,格式化磁盘重装系统才行。。。

更通用的办法时 pyenv install 前按 brew info zlib 的提示设置下几个变量

<br>$ brew info zlib | grep expor<br> export LDFLAGS="-L/usr/local/opt/zlib/lib"<br> export CPPFLAGS="-I/usr/local/opt/zlib/include"<br> export PKG_CONFIG_PATH="/usr/local/opt/zlib/lib/pkgconfig"<br>

好像我也是类似的操作

回到顶部