在MacOS上出现pyenv zlib错误:

59

我的目标

我正在尝试使用pyenv在我的MBP上并存安装Python 2.7.5和3.6.5。

pyenv安装

按照如何在Mac上使用Homebrew安装Python 2和3?的指示,我尝试了以下操作:

$ pyenv install 3.6.5

出现错误的原因可能有:

python-build: use openssl from homebrew
python-build: use readline from homebrew
Downloading Python-3.6.5.tar.xz...
-> https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tar.xz
Installing Python-3.6.5...
python-build: use readline from homebrew

BUILD FAILED (OS X 10.13.4 using python-build 20160602)

Inspect or clean up the working tree at /var/folders/d0/t8d3jjp161g2dyrd4k67ypc80000gn/T/python-build.20180426091253.34709
Results logged to /var/folders/d0/t8d3jjp161g2dyrd4k67ypc80000gn/T/python-build.20180426091253.34709.log

Last 10 log lines:
  File "/private/var/folders/d0/t8d3jjp161g2dyrd4k67ypc80000gn/T/python-build.20180426091253.34709/Python-3.6.5/Lib/ensurepip/__main__.py", line 5, in <module>
    sys.exit(ensurepip._main())
  File "/private/var/folders/d0/t8d3jjp161g2dyrd4k67ypc80000gn/T/python-build.20180426091253.34709/Python-3.6.5/Lib/ensurepip/__init__.py", line 204, in _main
    default_pip=args.default_pip,
  File "/private/var/folders/d0/t8d3jjp161g2dyrd4k67ypc80000gn/T/python-build.20180426091253.34709/Python-3.6.5/Lib/ensurepip/__init__.py", line 117, in _bootstrap
    return _run_pip(args + [p[0] for p in _PROJECTS], additional_paths)
  File "/private/var/folders/d0/t8d3jjp161g2dyrd4k67ypc80000gn/T/python-build.20180426091253.34709/Python-3.6.5/Lib/ensurepip/__init__.py", line 27, in _run_pip
    import pip
zipimport.ZipImportError: can't decompress data; zlib not available
make: *** [install] Error 1

我尝试了什么

  • 安装zlib: brew install zlib

我的问题

我该如何在MBP上使用pyenv安装多个Python环境?

10个回答

106

在Mojave上安装完Xcode命令行工具后,需要运行以下命令:

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

2
谢谢@samsin。在花费数小时后,这解决了我的问题。楼主应该将其标记为正确答案。 - Andrew-Dufresne
1
谢谢,这是非常有用的答案,大多数其他评论反映了Mojave之前Mac OS的问题。 - s_mart
3
我可以问问你是如何想到做那件事的,@samsin? - Neil
1
对于其他安装了Mojave但仍然遇到问题的人,请查看以下Github问题链接:https://github.com/pyenv/pyenv/issues/1219 - dcordz
3
2020年版的El Capitan已经不适用这个答案,https://dev59.com/dFUL5IYBdhLWcg3wopWy#54955286 是可行的解决方案! - Lewis Smith

46
brew install zlib
export LDFLAGS="-L/usr/local/opt/zlib/lib"
export CPPFLAGS="-I/usr/local/opt/zlib/include"
pyenv install 3.7.2

Samsin的答案对我没起作用。 我没有Packages文件夹


8
以下是我刚刚在Big Sur上使"pyenv install"工作时所做的内容。 - iszzypop

18

在 MacOS 11.1(Big Sur)上,我最终需要:

brew install bzip2
export LDFLAGS="-L $(xcrun --show-sdk-path)/usr/lib -L brew --prefix bzip2/lib"
export CFLAGS="-L $(xcrun --show-sdk-path)/usr/include -L brew --prefix bzip2/include"
pyenv install 3.9.0

我在./bash_profile中添加了导出命令,这样下次如果需要安装更多版本,我就可以直接使用pyenv。

保持关注:https://github.com/pyenv/pyenv/issues/1643,这个问题正在追踪中,希望在pyenv中能够解决这个问题。


我认为你需要使用 brew --prefix bzip2 命令的输出: export LDFLAGS="-L $(xcrun --show-sdk-path)/usr/lib -L $(brew --prefix bzip2)/lib" export CFLAGS="-L $(xcrun --show-sdk-path)/usr/include -L $(brew --prefix bzip2)/include" - postrational

8

我尝试了所有这里的解决方案都没有成功。

以下是我在MacOS 11.2.1(Big Sur)上成功运行的方法:

export MACOSX_DEPLOYMENT_TARGET=11.0
brew install pyenv bzip2 zlib xz openssl@1.1

## 3.6.8
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.8 < <(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch\?full_index\=1)

## 3.6.12
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.12 < <(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch\?full_index\=1)

## 3.7.9
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 3.7.9

这个解决方案来源于这个代码片段


3

pyenv维基有一个特定页面,用于常见构建问题。针对缺少zlib错误,提到了一些可能的解决方案。

我遇到了相同的ZipImportError,但使用以下命令安装成功:

CFLAGS="-I$(xcrun --show-sdk-path)/usr/include" pyenv install 3.6.5

这在我的MacOS 11.1(Big Sur)上使用Xcode 12.3无法工作。可以在此处找到一些解决方法:https://github.com/pyenv/pyenv/issues/1643。 - Vincent Gerris

0

@mathsyouth的{{solution}}对我有用,但是在命令前我不得不加入arch -x86_64


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community
虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。- 来自审查 - Jan

0
为了获得带有tkinter的Python 3.8.6,我在Vincent Gerris的答案和这篇博客文章的基础上进行了构建,并取得了成功。
brew install bzip2
export LDFLAGS="-L $(xcrun --show-sdk-path)/usr/lib -L brew --prefix bzip2/lib"
export CFLAGS="-L $(xcrun --show-sdk-path)/usr/include -L brew --prefix bzip2/include"
export PYTHON_CONFIGURE_OPTS="--with-tcltk-includes='-I/usr/local/opt/tcl-tk/include' --with-tcltk-libs='-L/usr/local/opt/tcl-tk/lib -ltcl8.6 -ltk8.6' --enable-framework"
pyenv install 3.8.6

0

0
我在所有这些尝试中都没有运气。但是找到了一个变通的解决方案。
我仍然看到。
pyenv install 3.8.8

python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.8.8.tar.xz...
-> https://www.python.org/ftp/python/3.8.8/Python-3.8.8.tar.xz
Installing Python-3.8.8...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk

BUILD FAILED (OS X 12.7.1 using python-build 1.2.23-19-g9ee109b6)

Inspect or clean up the working tree at /var/folders/mx/kwgrm0vx6vn1r5ptjpr75tjw0000gn/T/python-build.20231201205607.30499
Results logged to /var/folders/mx/kwgrm0vx6vn1r5ptjpr75tjw0000gn/T/python-build.20231201205607.30499.log

Last 10 log lines:
checking whether we are using the GNU C compiler... yes
checking whether clang accepts -g... yes
checking for clang option to accept ISO C89... none needed
checking how to run the C preprocessor... clang -E
checking for grep that handles long lines and -e... /usr/bin/grep
checking for a sed that does not truncate output... /usr/bin/sed
checking for --with-cxx-main=<compiler>... no
checking for the platform triplet based on compiler characteristics... darwin
configure: error: internal configure error for the platform triplet, please file a bug report
make: *** No targets specified and no makefile found.  Stop.

解决方法 - 从源头手动下载pkg文件

https://www.python.org/downloads/macos/手动下载一个发布版本 我下载并运行了python-3.8.9-macosx10.9.pkg

~/.zshrc

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
if command -v pyenv 1>/dev/null 2>&1; then
  eval "$(pyenv init -)"
fi

# setting up for pipenv 3.8
export PATH="$(pyenv root)/shims:$PATH"
export CXX=clang++
export LDFLAGS="-L$(brew --prefix openssl)/lib -L$(brew --prefix readline)/lib -L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib -L$(brew --prefix sqlite3)/lib"
export CPPFLAGS="-I$(brew --prefix openssl)/include -I$(brew --prefix readline)/include -I$(brew --prefix zlib)/include -I$(brew --prefix bzip2)/include -I$(brew --prefix sqlite3)/include"
export PKG_CONFIG_PATH="$(brew --prefix openssl)/lib/pkgconfig:$(brew --prefix readline)/lib/pkgconfig:$(brew --prefix zlib)/lib/pkgconfig:$(brew --prefix bzip2)/lib/pkgconfig:$(brew --prefix sqlite3)/lib/pkgconfig"

# Setting PATH for Python 3.8
export PATH="/Library/Frameworks/Python.framework/Versions/3.8/bin:$PATH"
alias python="python3"
export PATH="/Users/yourname/Library/Python/3.8/bin:$PATH"


which python
python: aliased to python3

➜  which python3
/Library/Frameworks/Python.framework/Versions/3.8/bin/python3

➜  pipenv shell --python 3.8
zsh: command not found: pipenv
➜  python3 -c "import ssl; print(ssl.OPENSSL_VERSION)"

OpenSSL 1.1.1k  25 Mar 2021
➜  python3 -m pip install --user pipenv

➜  /Library/Frameworks/Python.framework/Versions/3.8/bin/python3 -m site --user-base

/Users/yourname/Library/Python/3.8

➜  pipenv shell --python 3.8
Creating a virtualenv for this project...

(ai_sandbox) ➜  ai_sandbox jupyter-lab

此时我们已经进入了业务阶段,我可以继续运行Python,从而能够做我需要做的事情。

-1

以下方法适用于我在macOS Big Sur(11.6.1)上:

brew update
brew install bzip2
echo 'export PATH="/usr/local/opt/bzip2/bin:$PATH"' >> ~/.zshrc
export LDFLAGS="-L/usr/local/opt/zlib/lib"
export CPPFLAGS="-I/usr/local/opt/zlib/include"
pyenv install 3.8.6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接