Mac OS X Lion Psycopg2: 符号未找到:_PQbackendPID

3
我最近升级到Mac OS X Lion,并尝试在Python 2.6上重新使用psycopg2。 先前的一些网站上的指导(例如:http://favosdream.blogspot.com/2009/09/make-psycopg2-and-readline-work-in-snow.html)强制Python以32位模式运行,但没有成功。即使使用arch -i386 python强制将python设置为32位,仍然会出现错误:
symbol not found: _PQbackendPID
  Referenced from: /Library/Python/2.6/site-packages/psycopg2/_psycopg.so
  Expected in: flat namespace

狮子操作系统甚至更加支持64位,为什么不使用它呢? - mmmmmm
4个回答

6

最近在尝试将 psycopg2(2.8.2)导入到一个使用 Python3(3.5.3)的项目中时遇到了问题。运行 macOS Sierra(10.12.6),使用 PostgreSQL 9.6 和 pgAdmin3。

简而言之:安装 SQL 程序和安装程序创建的动态链接要小心

据我所知,与 psycopg2(2.8.2)兼容的所需 libpq 动态库(libpq.5.dylib)是 libpq 5.9+(libpq.5.9.dylib

当安装 postgres(或其他依赖于 postgres 的程序)时,它们可能会在 /usr/lib 中创建动态链接指向新安装的 .dylib 文件,这些文件不一定是您想要的。

例如,/usr/lib/libpq.5.dylib 可能指向 ./Applications/pgAdmin3.app/Contents/Frameworks/libpq.5.dylib,它是版本 5.6;旧版本的 libpq 动态库可能不包括某些函数,比如这里提到的 _PQsslAttribute

对我有效的解决方案:

/usr/local/lib 移动到 $PATH 的前面(因为 /usr/lib 可能只能被 root 编写),然后在 /usr/local/lib 中创建一个动态链接,指向 /Library/PostgreSQL/9.6/lib/libpq.5.9.dylib,如下所示:

cd /usr/local/lib
ln -s /Library/PostgreSQL/9.6/lib/libpq.5.9.dylib ./libpq.5.dylib

谢谢!使用Postgres.app,唯一适用于我的命令是:ln -s /Applications/Postgres.app/Contents/Versions/latest/lib/libpq.5.dylib ./libpq.5.dylib - Alex Joz
这很有趣。我试图将我的电脑上的所有东西(postgred、redis等)移动到Docker容器中,结果出现了这样的错误。现在,通过brew将它们放回去,一切都好了。 - C--
如何将“/usr/local/lib”移动到“$PATH”中?我在OS11/Apple Silicon/Postgres13/Postgres.app/Python3.8中遇到了相同的错误。 - niels

3
我也遇到了这个问题,我的系统是Snow Leopard/10.6.8。在一份紧张的合同中,我浪费了半天时间,很不开心。最终我通过以下步骤解决了问题:a) 完全删除所有的postgres版本并重新启动,b) 完全删除所有的psycopg2安装(使用locate命令并且要毫不留情),c) 将系统python升级到2.7,d) 重新安装virtualenv和pip以便它们指向正确的python版本,然后e) 按照此页面上的说明进行操作,从dmg安装程序安装postgres 9.1:

http://hardlifeofapo.com/psycopg2-and-postgresql-9-1-on-snow-leopard/

最终,这很容易实现:

virtualenv your_virtual_env_name
. your_virtual_env_name/bin/activate
export ARCHFLAGS="-arch i386 -arch x86_64"
export PATH=$PATH:/Library/PostgreSQL/9.1/bin
pip install psycopg2

祝你好运!


1
你是否尝试过在使用苹果提供的Python 2.6(位于/usr/bin/python2.6)时执行arch -i386 python2.6命令?但如果你仍在运行32位版本的psycopg2和PostgreSQL客户端库,那么现在是安装更新的64位或64位/32位通用版本的好时机。MacPorts可以帮助你完成这些操作。

所以这里是最新情况更新:执行 arch -i386 python 命令正常,我能够成功导入 psycopg2。但是,当尝试通过输入“arch -i386 python manage.py runserver”来运行我的 django 服务器时,它在导入阶段失败了。似乎在启动 django 时未采用 arch 参数。 - mikec
可能是另一个Python子进程正在启动并默认为64位。如果您使用的是Apple提供的Python 2.6,则可以通过设置特殊的Apple环境变量export VERSIONER_PYTHON_VERSION=2.6export VERSIONER_PYTHON_PREFER_32_BIT=yes(如果使用/usr/bin/python)来解决问题。请参阅Apple Python手册(man python)。但从长远来看,最好升级。 - Ned Deily
哦,该死!如果你在另一个问题中遵循了其他人的建议,并通过符号链接覆盖了/usr/bin/python,那么上面的export建议可能不起作用。我相信这个魔法是由苹果特殊的/usr/bin/python程序处理的。 - Ned Deily

1

符号未找到:_PQbackendPID,预期在:平面命名空间中

我在Big Sur上的Arm64 Mac上遇到了相同的符号错误。

我正在使用Progressapp(x86_64)和psycopg2 v2.8.4(Arm64)。由于尚未提供Progressapp Arm64版本,因此我决定检查psycopg2库的链接。

我的解决方案是,首先卸载Progressapp, 然后导出PATH=/opt/local/lib/postgresql13/bin:$PATH指向Arm64 libpq.5.13.dylib, 最后重新安装Pogressapp。因此,psycopg2会加载所有所需的Arm64库。

otool -E venv/lib/python3.8/site-packages/psycopg2/_psycopg.cpython-38-darwin.so outputs:

    /opt/local/lib/postgresql13/libpq.5.dylib (compatibility version 5.0.0, current version 5.13.0)
        /opt/local/lib/libssl.1.1.dylib (compatibility version 1.1.0, current version 1.1.0)
        /opt/local/lib/libcrypto.1.1.dylib (compatibility version 1.1.0, current version 1.1.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1292.60.1)

1
你从哪里获取到 Arm64 libpq.5.13.dylib 的? - yanik
1
嗨Yanik。Arm64 libpq.5.13.dylib随(macports)端口安装postgresql13 @ 13.1_0一起提供。 - Mahmut ARIKAN
我该如何执行导出命令?你能提供一个完整的代码片段吗?我是Mac的新手。谢谢! - BastianW
嗨,BastionW,打开终端并输入以下命令: export PATH=/opt/local/lib/postgresql13/bin:$PATH 或者最好将其添加到您的 .bashrc 或 .zshrc 中,这样每次打开新终端时都会自动加载。 - Mahmut ARIKAN

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