答案是安装缺失的PostgreSQL开发包或改用psycopg2-binary:Linux需sudo apt-get install libpq-dev(Debian/Ubuntu)或sudo yum install postgresql-devel(CentOS/RHEL),macOS用brew install postgresql,Windows直接pip install psycopg2-binary;生产环境应编译安装psycopg2以确保与服务端ABI兼容,开发测试则优先选用预编译的psycopg2-binary。
psycopg2 安装失败不是你环境有问题,而是它默认走源码编译路径,而你的系统缺关键依赖——最常见就是 pg_config 找不到,或者 libpq 版本不匹配。直接上解决方案,别绕弯。这是最典型的错误,本质是 psycopg2 想从源码编译,但连 PostgreSQL 的“配置说明书”都找不到。pg_config 不是独立工具,它随 PostgreSQL 客户端或开发包一起安装。
sudo apt-get install libpq-dev,它会自动带出 pg_config
sudo yum install postgresql-devel 或 dnf install postgresql-devel
libpq):brew install postgresql,之后 which pg_config 通常返回 /opt/homebrew/bin/pg_config 或 /usr/local/bin/pg_config
pg_config 本就不参与 Windows 编译流程,直接跳到下一节装完后验证:pg_config --version 能输出版本号(如 14.5),再试 pip install psycopg2 就大概率成功。
psycopg2-binary 是预编译包,按理不该触发 egg_info 编译流程。但 pip 有时会忽略 -binary 后缀,仍尝试源码构建——尤其在旧版 pip 或缓存污染时。
pip install psycopg2-binary --only-binary :all:
pip cache purge && pip install psycopg2-binary
pyproject.toml 或 setup.py 里的 build-backend 干扰:某些项目配置会覆盖 pip 的二进制偏好如果仍失败,说明当前 Python 环境里有残留的 psycopg2 源码构建产物,先 pip uninstall psycopg2 psycopg2-binary 彻底清理,再重装。
立即学习“Python免费学习笔记(深入)”;
官方明确建议:生产环境用 psycopg2(源码编译版),开发/测试用 psycopg2-binary。这不是玄学,是实际差异:
psycopg2 编译时绑定本地 libpq 版本,和 PostgreSQL 服务端 ABI 兼容性更稳,尤其在高并发长连接场景下内存行为更可预测psycopg2-binary 自带静态链接的 libpq,省事但可能和你的 PostgreSQL 服务器版本存在细微协议差异(比如新引入的认证方式、参数格式)/usr/lib64/pgsql/libpq.so.5),那 libpq-dev 或 postgresql-devel 也必然存在,编译安装就是顺手的事别图省事在生产机上硬塞 psycopg2-binary,上线后遇到连接复用异常或 SSL 握手失败,排查成本远高于多敲几条安装命令。
这是 macOS Catalina 及之后版本的典型链接问题:Xcode 命令行工具没装全,或 OpenSSL 路径没暴露给编译器。
xcode-select --install
brew install openssl),需要临时导出路径:export LDFLAGS="-L$(brew --prefix openssl)/lib" 和 export CPPFLAGS="-I$(brew --prefix openssl)/include",再运行 pip install psycopg2
psycopg2-binary,避开所有本地编译环节Mac 用户最容易忽略的是:Homebrew 安装的 PostgreSQL 默认不把 pg_config 加入 $PATH,哪怕 which pg_config 能查到,pip 也可能读不到——此时加一行 export PATH="/opt/homebrew/bin:$PATH" 到 shell 配置里,重启终端再试。
psycopg2-binary,后者必须确保 pg_config 和 libpq 版本与 PostgreSQL 服务端对齐。