如何让 ctypes find_library 找到 libpq?

esl*_*kas 9 python macos ctypes apple-m1 psycopg3

我正在 Python (3.9.9) 中构建一个简单的数据库接口,并使用 psycopg (3.0.7) 连接到我的 Postgres (14.1) 数据库。直到最近,这个应用程序的开发都是在 Linux 上进行的,但现在我在 M1 Mac mini 上使用 macOS Monterey。这似乎给 psycopg 广泛使用的 ctypes 带来了一些麻烦。我收到的错误如下:

ImportError: no pq wrapper available.
Attempts made:
- couldn't import psycopg 'c' implementation: No module named 'psycopg_c'
- couldn't import psycopg 'binary' implementation: No module named 'psycopg_binary'
- couldn't import psycopg 'python' implementation: libpq library not found
Run Code Online (Sandbox Code Playgroud)

基于psycopg源码,这是 ctypes 无法 util.find_library libpq.dylib 的错误。Postgres 安装为 Postgres.app,这意味着 libpq.dylib 的路径是

/Applications/Postgres.app/Contents/Versions/14/bin/lib

我尝试将其添加到 PATH 中,但没有成功。然后我创建了一个指向 /usr/local/lib 中路径的符号链接,但(不出所料)它也不起作用。然后我做了一些挖掘,发现这个问题描述了同样的问题。我不是 macOS 专家,所以我不确定如何解释所提出的一些观点。我需要添加共享缓存的路径吗?另外,我不想分叉 Python 存储库并按照建议实现 dlopen() 方法,因为它似乎会导致其他问题。

无论如何,有没有办法可以快速绕过这个问题呢?作为附加参考,产生上述错误的代码只是:

import psycopg

print(psycopg.__version__)
Run Code Online (Sandbox Code Playgroud)

小智 2

我遇到了这个问题,但相关问题的答案向我建议了解决方案:尝试将 envar 设置DYLD_LIBRARY_PATH为您确定的路径。

注意,为了让它自己工作,我:

  • 使用路径/Applications/Postgres.app/Contents/Versions/latest/lib
  • 必须安装Python 3.9