MacOS下导入psycopg2报错:Library not loaded问题求助
问题重现
导入psycopg2时触发以下错误:
ImportError: dlopen(/Users/lce21/Documents/GitHub/hazen-web-app/hazen-web-app/lib/python3.8/site-packages/psycopg2/_psycopg.cpython-38-darwin.so, 0x0002): Library not loaded: /usr/local/opt/postgresql/lib/libpq.5.dylib
Referenced from: /Users/lce21/Documents/GitHub/hazen-web-app/hazen-web-app/lib/python3.8/site-packages/psycopg2/_psycopg.cpython-38-darwin.so
Reason: tried: '/usr/local/opt/postgresql/lib/libpq.5.dylib' (no such file), '/usr/local/lib/libpq.5.dylib' (no such file), '/usr/lib/libpq.5.dylib' (no such file), '/usr/local/Cellar/postgresql@14/14.6/lib/libpq.5.dylib' (no such file), '/usr/local/lib/libpq.5.dylib' (no such file), '/usr/lib/libpq.5.dylib' (no such file)
已尝试操作:
- 安装
psycopg2-binary - 在虚拟环境/全局环境重新安装
psycopg2 - 确认Postgres已成功安装
解决方案
1. 定位libpq.5.dylib的实际位置
先通过命令找到系统中真实存在的libpq.5.dylib文件:
# 搜索brew安装的Postgres路径 find /usr/local -name "libpq.5.dylib" # 如果是Postgres.app安装,搜索应用目录 find /Applications/Postgres.app -name "libpq.5.dylib"
执行后会得到类似路径:/usr/local/Cellar/postgresql@15/15.3/lib/libpq.5.dylib 或 /Applications/Postgres.app/Contents/Versions/15/lib/libpq.5.dylib
2. 方法一:创建软链接到缺失路径
psycopg2正在查找/usr/local/opt/postgresql/lib/libpq.5.dylib,我们可以将实际存在的文件链接到该路径:
# 先创建目标目录(如果不存在) sudo mkdir -p /usr/local/opt/postgresql/lib # 替换[实际路径]为你找到的libpq.5.dylib路径 sudo ln -s [实际路径] /usr/local/opt/postgresql/lib/libpq.5.dylib
示例:
sudo ln -s /usr/local/Cellar/postgresql@15/15.3/lib/libpq.5.dylib /usr/local/opt/postgresql/lib/libpq.5.dylib
3. 方法二:设置DYLD_LIBRARY_PATH环境变量
将Postgres的lib目录加入动态链接库路径:
- 临时生效(仅当前终端会话):
# 替换[Postgres lib路径]为实际路径,比如/usr/local/Cellar/postgresql@15/15.3/lib export DYLD_LIBRARY_PATH=[Postgres lib路径]:$DYLD_LIBRARY_PATH
- 永久生效(添加到shell配置文件):
若使用zsh,编辑~/.zshrc;使用bash则编辑~/.bash_profile,加入:
export DYLD_LIBRARY_PATH=/usr/local/Cellar/postgresql@15/15.3/lib:$DYLD_LIBRARY_PATH
执行source ~/.zshrc(或对应配置文件)使修改生效。
4. 方法三:重新编译psycopg2并指定Postgres路径
先卸载已安装的psycopg2相关包:
pip uninstall -y psycopg2 psycopg2-binary
指定Postgres的bin路径后重新编译安装:
# 替换[Postgres bin路径]为实际路径,比如/usr/local/Cellar/postgresql@15/15.3/bin export PATH=[Postgres bin路径]:$PATH pip install psycopg2 --no-binary :all:
额外检查
- 若用brew安装Postgres,执行
brew info postgresql确认安装版本和路径,确保找到的文件路径与实际版本匹配。 - 若用Postgres.app,确保应用已启动,且路径中的版本号与安装的Postgres版本一致。
内容的提问来源于stack exchange,提问作者MeravigliaTitti

