在MacOS上使用pip安装psycopg2包失败

110

我正在为我的一个课程项目工作,需要下载psycopg2软件包才能使用正在使用的PostgreSQL数据库。然而,当我尝试使用pip install psycopg2下载时,会出现以下错误:

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

为什么会发生这种情况?

19个回答

352

我通过安装命令行工具来解决了这个问题

xcode-select --install

然后通过Homebrew安装openssl并手动将我的homebrew安装的openssl链接到pip:

env LDFLAGS="-I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib" pip install psycopg2

在 macOS Sierra 10.12.1 上


4
Xcode的安装对我来说已经足够让它工作了。感谢你的关注。 - Adam Starrh
安装开发工具后,我也得到了它。 - BBischof
对我也起作用了,谢谢。那么什么是永久解决方案? - Ajay Kumar
同样适用于Catalina操作系统。 - AlxVallejo
3
截至2022年5月和使用brew,以下命令适用于我:LDFLAGS="-I/opt/homebrew/opt/openssl/include -L/opt/homebrew/opt/openssl/lib" pip install psycopg2-binary - Bo Lu

63

请尝试使用以下方式安装:

pip install psycopg2-binary

这个能替代 psycopg2 吗? - pkaramol
1
@pkaramol 是的,它是这样的。 - Dheeraj Pande
1
确保您的 pip 已经更新,同时运行 pip install -U pip 命令,否则您会遇到类似于 vcvarsall.bat not found 的错误。 - Andrew Allen
4
“二进制包在开发和测试时是一个实用的选择,但在生产环境中建议使用从源代码构建的软件包。” - Nikolay Marinov
这是一个针对相当新的 psycopg2 的好答案,但是旧版本(例如 2.8.6)没有被打包者提供,必须在本地构建轮子。 - minusf

48
brew install postgresql
如果PostgreSQL存在,则运行:
brew upgrade postgresql
sudo pip install psycopg2

在虚拟环境中:

env LDFLAGS='-L/usr/local/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib' pip install psycopg2==2.8.4

如果您只需要使用命令 pip install psycopg2,则在macOSX中导出路径:

export LDFLAGS="-I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib"

3
这对我来说非常有效,使用brew install然后在终端中键入“env =”。然而这是完全的黑魔法,有人可以解释为什么需要这样做以及它实际上是做了什么吗?谢谢!关于信息,在2020年5月,Mac的版本是Catalina。 - Seb
这是唯一对我有用的技巧 :) - Ayoub EL MAJJODI
1
对我来说,brew install postgresql解决了问题! - jgtvares

22

我用以下方式进行修复:

brew reinstall openssl
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/opt/openssl/lib/

3
这个方法对我在Catalina上使用的Python版本3.8.2也起作用。我使用pyenv来管理我的Python环境和安装。你的解决方案对我有效,但我使用了$ python -m pip install psycopg2命令,而不是其他人使用的$ pip install psycopg2,这样我们就不会知道我们正在使用和安装哪个解释器。这将确保pip将使用和安装我的默认Python解释器,也就是对我来说是3.8.2版本。 - Joyoyoyoyoyo
1
那个导出需要永久添加到我的 .bashrc 文件中吗? - Rafael Gomes Francisco

13

使用pipenv安装psycopg2时遇到类似的问题:

ld: 找不到-lssl库', ' clang: 错误: 链接器命令失败 退出,状态码为1 (使用-v查看调用)', " error: 命令'clang' 失败,退出状态码为1", '
----------------------------------------',

我尝试了上面所有的建议,但都没有奏效。几个月前我在另一个虚拟环境中遇到过这个问题,并记得读到关于它是psycopg2版本问题的内容。因此,我尝试了2.7.1和2.8.3版本进行安装,但都失败了。不知怎么的,版本2.7.7可以工作:

pipenv install psycopg2==2.7.7

希望我有时间进一步了解这个问题,以便真正理解正在发生的事情。但目前我没有时间,而这个方法可行。


12

在Mac OS 11.06 BigSur M1版上,使用pyenv进行安装

brew reinstall libpq
brew reinstall openssl
如果还没有安装,请进行安装。
brew info libpq
brew info openssl

将导出的两个输出逻辑地合并,从:

为了让编译器找到OpenSSL@3,您可能需要设置:

export LDFLAGS="-L/opt/homebrew/opt/openssl@3/lib"

export CPPFLAGS="-I/opt/homebrew/opt/openssl@3/include"

... export LDFLAGS="-L/opt/homebrew/opt/libpq/lib"

export CPPFLAGS="-I/opt/homebrew/opt/libpq/include"

转换成:

export LDFLAGS="-L/opt/homebrew/opt/libpq/lib -L/opt/homebrew/opt/openssl@3/lib"
export CPPFLAGS="-I/opt/homebrew/opt/libpq/include -I/opt/homebrew/opt/openssl@3/include"

那么你可以重新安装psycopg2,强制重新编译,否则你将在运行时遇到这个问题

pip uninstall psycopg2 
pip install psycopg2 --no-cache-dir

7
  1. Install/update Xcode developer tools

    xcode-select --install
    
  2. Query postgres path

    find / -name pg_config  2>/dev/null
    
  3. Install psycopg2, use the path you got in step 2. Mine was '/usr/local/Cellar/postgresql/9.5.0/bin/pg_config'

    PATH=$PATH:/usr/local/Cellar/postgresql/9.5.0/bin/ pip install psycopg2
    

4

好的,有很多不同的选项对我都没用,但最终找到了解决方案!

首先,尝试这个:

brew reinstall openssl

重新安装过程结束后,您将在Caveats(注意事项)部分中基本上看到以下内容。由于我使用的是 macOS Big Sur(版本11.1)和zsh终端,我已经将这些内容放入了zshrc配置文件中。

打开zshrc或其他针对您系统的配置文件:

nano ~/.zshrc

把以下几行代码粘贴到文件末尾(或根据你所遇到的注意事项进行修改),但请记住,Homebrew提供的OpenSSL可能会与系统自带的OpenSSL发生冲突(我在macOS上收到了提醒提示,说系统自带LibreSSL),但无论如何都可以正常运行:
export PATH="/opt/homebrew/opt/openssl@1.1/bin:$PATH"
export LDFLAGS="-L/opt/homebrew/opt/openssl@1.1/lib"
export CPPFLAGS="-I/opt/homebrew/opt/openssl@1.1/include"

按下^X并确认使用Yes保存文件并退出。

希望现在你可以安装psycopg2:

pip3 install psycopg2-binary

我仍不确定问题的根本原因,当我尝试为我的项目重新安装pipenv时,它突然出现了(可能是最近的某些系统更新导致的)。


一样!你的建议起作用了!非常感谢你挽救了我的一天。 - yigidix

2

看起来openssl软件包没有安装。尝试安装它然后再运行pip install命令。虽然我不是macos用户,但我相信brew在该平台上简化了软件包管理。

你可能还需要安装Python开发和postgresql开发软件包。


2

这对我有效(在终端上):

find / -name pg_config  2>/dev/null

然后添加路径:
export PATH=$PATH:/Applications/Postgres.app/Contents/Versions/9.5/bin/

操作系统版本:MacOS Sierra

希望这能帮到您。


3
这假定你已经在你的 Mac 上安装了 Postgres.app,而不是使用 mac ports、home brew、EnterpriseDB 安装程序或者其他任何一种将 postgresql 服务器打包/安装到你的 Mac 上的方式,对吗? - scot
哦,原来的问题是关于缺少-lssl库和“clang”,而不是pg_config工具。Clang在Xcode中,另一件事在openssl库中。用户@zganger对这个问题有正确的答案。(我在寻找pg_config问题时来到这里,所以你的答案对我帮助很大,但它并不是问题所问的)。 - scot

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