【问题标题】:psycopg2 ImportError: undefined symbol: PQconninfopsycopg2 ImportError:未定义符号:PQconninfo
【发布时间】:2019-11-20 13:19:11
【问题描述】:

无法导入 psycopg2

python 控制台中的输出:

导入 psycopg2

Traceback(最近一次调用最后一次): 文件“”,第 1 行,在 文件“/home/user/.py_virtualenvs/verb_py3/lib/python3.5/site-packages/psycopg2/init.py”,第 50 行,在

从 psycopg2._psycopg 导入(#noqa ImportError:/home/user/.py_virtualenvs/verb_py3/lib/python3.5/site-packages/psycopg2/_psycopg.cpython-35m-x86_64-linux-gnu.so:未定义符号:PQconninfo

【问题讨论】:

  • 嗨,你得到这个答案了吗?
  • 如果您从源代码构建,任何人都有解决方案?

标签: python-3.5 psycopg2 postgresql-9.5


【解决方案1】:

安装 psycopg2-binary 包解决了我的问题。

pip install psycopg2-binary

【讨论】:

    【解决方案2】:

    这可能是底层系统的缺陷问题。可能有多个版本的共享库,在运行时您可能无法找到合适的库。解决起来通常很痛苦。由于我看到了同样的问题,我将尝试如何找出问题所在。这将比给出一个固定的解决方案更有用。我仍然需要为自己找到解决方案: 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;
    

    注意:psycopg 的作者已经给了你一个答案:

    "PQconninfo not available in libpq < 9.3"
    

    这意味着问题在于运行时的旧 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
    

    你应该在这里找到一个共享库:

    _psycopg.cpython-38-x86_64-linux-gnu.so
    

    看看图书馆:

    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)
    

    注意这一行:libpq.so.5 => /usr/lib64/libpq.so.5

    现在看看这个库,只对PPconninfo感兴趣(它有很多功能和数据)

    nm -D /usr/lib64/libpq.so.5 | grep PQconninfo
    000000000000cb90 T PQconninfoFree
    000000000000df30 T PQconninfoParse
    

    看你没有 PQconninfo 功能。

    我相信通过说明如何解决这个问题会更有帮助;这可以帮助您解决许多类似的问题。

    现在我将在我的系统上添加解决方案:

    原来我的系统上有多个libpg。

    cd /usr
    find . -name "libpq*"
    ... many others ignored
    ./pgsql-11/lib/libpq.so
    

    然后更新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
    

    【讨论】:

    • 感谢建明!您的调试流程对我帮助很大。显然,我有两个库 postgresql-libs.x86_64 和 postgresql12-libs.x86_64 。对我来说,解决方案是 yum remove postgresql-libs.x86_64 。
    【解决方案3】:

    使用 conda 而不是 pip 重新安装 psycopg2 解决了该问题。

    【讨论】:

    • 对我来说也是如此,谢谢@tomanizer。如果其他人需要它,这里是链接anaconda.org/anaconda/psycopg2(记得从 conda 环境中安装它)
    【解决方案4】:

    就像@Kemin Zhou 在其中一个答案中所说,这个问题的原因之一可能是一个较旧的libpq.so file

    我目前使用的是 Cent OS 7,安装的 postgresql-lib 版本是:

    $ yum list installed | grep postgres
    Failed to set locale, defaulting to C
    postgresql.x86_64                    9.2.24-4.el7_8                   installed
    postgresql-devel.x86_64              9.2.24-4.el7_8                   installed
    postgresql-libs.x86_64               9.2.24-4.el7_8                   installed
    

    我什至无法更新它,因为 yum 无法找到它的更高版本:

    $ yum list --showduplicates postgresql
    Failed to set locale, defaulting to C
    Loaded plugins: fastestmirror, langpacks
    Loading mirror speeds from cached hostfile
     * epel: mirrors.ircam.fr
    Installed Packages
    postgresql.x86_64 9.2.24-4.el7_8 installed
    Available Packages
    postgresql.i686                    9.2.24-2.el7                    base
    postgresql.x86_64                  9.2.24-2.el7                    base
    postgresql.i686                    9.2.24-2.el7_7                    updates
    postgresql.x86_64                  9.2.24-2.el7_7                    updates
    postgresql.i686                    9.2.24-4.el7_8                    updates
    postgresql.x86_64                  9.2.24-4.el7_8                    updates
    

    This 链接帮助了我。

    使用该链接,我首先添加了这个包含更新的 postgresql10-libs 的 repo:

    $ yum install https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
    

    然后我安装了更新的 postgresql10-libs

    $ yum install postgresql10-libs.x86_64
    

    【讨论】:

      猜你喜欢
      • 2018-02-24
      • 1970-01-01
      • 1970-01-01
      • 2022-05-27
      • 2015-12-29
      • 2016-02-11
      • 2015-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多