mah*_*esh 5 psycopg2 python-3.5 postgresql-9.5
无法导入 psycopg2
python控制台输出:
导入 psycopg2
回溯(最近通话最后一个):文件“”,1号线,在文件“/home/user/.py_virtualenvs/verb_py3/lib/python3.5/site-packages/psycopg2/初始化py”为50行,在
from psycopg2._psycopg import (#noqa ImportError: /home/user/.py_virtualenvs/verb_py3/lib/python3.5/site-packages/psycopg2/_psycopg.cpython-35m-x86_64-linux-gnu.so: 未定义符号: PQconninfo
这可能是底层系统中的缺陷问题。共享库可能有多个版本,在运行时您可能无法找到合适的库。解决起来通常很痛苦。由于我看到了同样的问题,我将尝试找出问题所在。这比给出一个固定的解决方案更有用。我仍然需要为自己找到解决方案: 1. 从较新版本构建 libpq 库。2. 找到 psycopg2 在编译时使用的正确 libpq。
进入psycopg2的源目录:
myuid@mycomputer:~/Downloads/psycopg2$ find . -name "*.c" | xargs grep PQconninfo
./psycopg/psycopgmodule.c: PQconninfoOption *options = NULL;
./psycopg/psycopgmodule.c: options = PQconninfoParse(Bytes_AS_STRING(dsn), &err);
./psycopg/psycopgmodule.c: PyErr_SetString(OperationalError, "PQconninfoParse() failed");
./psycopg/psycopgmodule.c: PQconninfoFree(options); /* safe on null */
./psycopg/connection_int.c: PQconninfoOption *connopts, *ptr;
./psycopg/connection_int.c: connopts = PQconninfoParse(pgdsn, NULL);
./psycopg/connection_int.c: PQconninfoFree(connopts);
./psycopg/connection_int.c: PQconninfoOption *options = NULL;
./psycopg/connection_int.c: if (!(options = PQconninfoParse(dsn, NULL))) {
./psycopg/connection_int.c: PQconninfoFree(options);
./psycopg/conninfo_type.c:".. seealso:: libpq docs for `PQconninfo()`__ for details.\n"
./psycopg/conninfo_type.c: PQconninfoOption *options = NULL;
./psycopg/conninfo_type.c: if (!(options = PQconninfo(self->conn->pgconn))) {
./psycopg/conninfo_type.c: PQconninfoFree(options);
./psycopg/conninfo_type.c: PyErr_SetString(NotSupportedError, "PQconninfo not available in libpq < 9.3");
./psycopg/connection_type.c: PQconninfoOption *options = NULL;
./psycopg/connection_type.c: if (!(options = PQconninfo(self->pgconn))) {
./psycopg/connection_type.c: PQconninfoFree(options);
./psycopg/connection_type.c: PyErr_SetString(NotSupportedError, "PQconninfo not available in libpq < 9.3");
./psycopg/utils.c:/* Make a dict out of PQconninfoOption array */
./psycopg/utils.c:psyco_dict_from_conninfo_options(PQconninfoOption *options, int include_password)
./psycopg/utils.c: PQconninfoOption *o;
Run Code Online (Sandbox Code Playgroud)
注意:psycopg 作者已经给你答案了:
"PQconninfo not available in libpq < 9.3"
Run Code Online (Sandbox Code Playgroud)
这意味着问题出在运行时较旧的 libpq,您可能使用了较新版本的 libpq,否则 psycopg2 可能无法编译。
顺便说一句: PQconninfo(self->conn->pgconn) 你知道 PQconninfo 是一个 C 函数,它应该在你的 libpq 中
您的错误消息通常会告诉您问题出在哪里,在我的情况下是:
/usr/local/lib/python3.8/site-packages/psycopg2-2.8.5.dev0-py3.8-linux-x86_64.egg/psycopg2
Full error: >>> import psycopg2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.8/site-packages/psycopg2-2.8.5.dev0-py3.8-linux-x86_64.egg/psycopg2/__init__.py", line 50, in <module>
from psycopg2._psycopg import ( # noqa
ImportError: /usr/local/lib/python3.8/site-packages/psycopg2-2.8.5.dev0-py3.8-linux-x86_64.egg/psycopg2/_psycopg.cpython-38-x86_64-linux-gnu.so: undefined symbol: PQconninfo
Run Code Online (Sandbox Code Playgroud)
在这里你应该找到一个共享库:
_psycopg.cpython-38-x86_64-linux-gnu.so
Run Code Online (Sandbox Code Playgroud)
看看图书馆:
ldd _psycopg.cpython-38-x86_64-linux-gnu.so
linux-vdso.so.1 => (0x00007ffe985c7000)
libpq.so.5 => /usr/lib64/libpq.so.5 (0x00007ff922a13000)
libpthread.so.0 => /usr/lib64/libpthread.so.0 (0x00007ff9227f7000)
libc.so.6 => /usr/lib64/libc.so.6 (0x00007ff922429000)
libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007ff9221b7000)
libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007ff921d54000)
libkrb5.so.3 => /usr/lib64/libkrb5.so.3 (0x00007ff921a6b000)
libcom_err.so.2 => /usr/lib64/libcom_err.so.2 (0x00007ff921867000)
libgssapi_krb5.so.2 => /usr/lib64/libgssapi_krb5.so.2 (0x00007ff92161a000)
libldap_r-2.4.so.2 => /usr/lib64/libldap_r-2.4.so.2 (0x00007ff9213bb000)
/lib64/ld-linux-x86-64.so.2 (0x00007ff922e87000)
libk5crypto.so.3 => /usr/lib64/libk5crypto.so.3 (0x00007ff921188000)
libdl.so.2 => /usr/lib64/libdl.so.2 (0x00007ff920f84000)
libz.so.1 => /usr/lib64/libz.so.1 (0x00007ff920d6e000)
libkrb5support.so.0 => /usr/lib64/libkrb5support.so.0 (0x00007ff920b5e000)
libkeyutils.so.1 => /usr/lib64/libkeyutils.so.1 (0x00007ff92095a000)
libresolv.so.2 => /usr/lib64/libresolv.so.2 (0x00007ff920741000)
liblber-2.4.so.2 => /usr/lib64/liblber-2.4.so.2 (0x00007ff920532000)
libsasl2.so.3 => /usr/lib64/libsasl2.so.3 (0x00007ff920315000)
libssl3.so => /usr/lib64/libssl3.so (0x00007ff9200bc000)
libsmime3.so => /usr/lib64/libsmime3.so (0x00007ff91fe94000)
libnss3.so => /usr/lib64/libnss3.so (0x00007ff91fb65000)
libnssutil3.so => /usr/lib64/libnssutil3.so (0x00007ff91f935000)
libplds4.so => /usr/lib64/libplds4.so (0x00007ff91f731000)
libplc4.so => /usr/lib64/libplc4.so (0x00007ff91f52c000)
libnspr4.so => /usr/lib64/libnspr4.so (0x00007ff91f2ee000)
libselinux.so.1 => /usr/lib64/libselinux.so.1 (0x00007ff91f0c7000)
libcrypt.so.1 => /usr/lib64/libcrypt.so.1 (0x00007ff91ee90000)
librt.so.1 => /usr/lib64/librt.so.1 (0x00007ff91ec88000)
libpcre.so.1 => /usr/lib64/libpcre.so.1 (0x00007ff91ea26000)
libfreebl3.so => /usr/lib64/libfreebl3.so (0x00007ff91e823000)
Run Code Online (Sandbox Code Playgroud)
注意这一行:libpq.so.5 => /usr/lib64/libpq.so.5
现在看看这个库,只对PPconninfo感兴趣(它有很多功能和数据)
nm -D /usr/lib64/libpq.so.5 | grep PQconninfo
000000000000cb90 T PQconninfoFree
000000000000df30 T PQconninfoParse
Run Code Online (Sandbox Code Playgroud)
看你没有 PQconninfo 功能。
我相信通过说明如何解决这个问题会更有帮助;这可能会帮助您解决许多类似的问题。
现在我将在我的系统上添加解决方案:
原来我的系统上有多个 libpg。
cd /usr
find . -name "libpq*"
... many others ignored
./pgsql-11/lib/libpq.so
Run Code Online (Sandbox Code Playgroud)
然后将LD_LIBRARY_PATH更新为/usr/pgsql-11/lib:/usr/local/lib64,那么问题就没有了。
python3.8
Python 3.8.1 (default, Jan 7 2020, 15:07:37)
[GCC 7.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import psycopg2
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6468 次 |
最近记录: |