使用 pipenv 安装 mysqlclient 在 Mac OS 上从未成功(M1 和 intel CPU)

installing mysqlclient with pipenv never succeed on Mac OS (both M1 and intel CPU)

我尝试在我的两台 macbook pro(intel 2018 和 M1 2020)上使用 pipenv 安装 mysqlclient,但它一直给我以下错误:

ld: library not found for -lzstd
clang: error: linker command failed with exit code 1 (use -v to see invocation)
error: command 'clang' failed with exit status 1

我想出了一个解决方案,它允许我在阅读此 comment 后使用 homebrew 显式安装 mysqlclient,使用以下命令:

brew install zstd
CFLAGS="-I$(brew --prefix)/include" 
LDFLAGS="-L$(brew --prefix)/lib" 
brew install mysqlclient

但是,我仍然遇到与 pipenv 相同的问题,我真的很想让它与 pipenv 一起工作,有什么想法吗?

这是我的 pipfile(不包含 mysqlclient,因为它失败了):

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
pandas = "*"
numpy = "*"
mysql-connector-python = "*"

[dev-packages]

[requires]
python_version = "3.8"

经过几个小时的发现和阅读互联网上的每个 post,我意识到 ld: library not found for -lzstd 意味着定义的 zstd 库的路径是错误的,所以我仔细检查了我导出的路径和 bingo .


这里总结了如何在 M1 mac 上安装 mysqlclientpipenv(对于英特尔,只是自制程序根路径不同):

首先按照https://brew.sh/安装homebrew(统一安装包,也可以选择不使用,只需要找出所有需要的路径即可图书馆)

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

接下来,使用homebrew安装mysql

brew install mysql

然后由于某些原因,mysqlclient 软件包需要 openSSLzstd(如果不这样做,您将收到一条错误消息,提示您安装)

brew install openSSL
brew install zstd

现在,要让计算机在安装 mysqlclient 时知道这些必需的包在哪里,您需要在 .bash_profile/.zshrc 中明确定义路径。同样,如果您不执行此步骤,则会有 errors/warnings 告诉您执行此操作。对我来说,因为所有东西都是通过 homebrew 安装的,它们都位于 homebrew 目录下,所以我可以快速将它们添加到我的 .zshrc 中,请注意 LDFLAGS 有两个路径,您可能会通读许多在 LDFLAGS 上只有一条路径的解决方案,但它们不会成功,因为在安装 mysqlclient 软件包之前需要安装两个库,这就是我卡住的地方。

export PATH="/opt/homebrew/opt/mysql-client/bin:$PATH"
export LDFLAGS="-L/opt/homebrew/opt/openssl@1.1/lib -L/opt/homebrew/Cellar/zstd/1.5.0/lib"
export CPPFLAGS="-I/opt/homebrew/opt/openssl@1.1/include"

您可能想知道什么是 LDFLAGSCPPFLAGS。根据这个page,

LDFLAGS refers for linker flags and is often user defined libraries

CPPLAGS is used by the preprocessor and is often the include directory

所以这两个标志基本上让您的安装知道您的先决条件的路径在哪里。并且每个标志可以包含多个路径。

现在您可以愉快地pipenv install mysqlclient并收到一条成功消息。