加载psycopg2模块时出现“undefined symbol: _PyObject_NextNotImplemented”错误

4
environment: Ubuntu 10.04 LTS
build Python 2.7.2 with ./configure --with-zlib --enable-unicode=ucs4
postgresql-9.0
wsgi
Django 1.3
virtualenv
apache

我正在尝试构建Ubuntu Django应用程序服务器。安装过程没有任何错误信息。确切的安装方法在Ubuntu 11.04上成功。然而,在Ubuntu 10.04上完成安装并尝试从Django加载psycopg2时,我遇到了以下错误(在11.04上不会出现此错误):

File "/home/nreeves/venv/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 24, in <module>
raise ImproperlyConfigured("Error loading psycopg2 module: %s" % e)
ImproperlyConfigured: Error loading psycopg2 module: /home/nreeves/venv/lib/python2.7/site-packages/psycopg2/_psycopg.so: undefined symbol: _PyObject_NextNotImplemented

我猜测是某个库的链接不正确...但我不知道从哪里开始...我有以下输出 - 不确定这是否能帮助你帮助我...
$ ldd /home/nreeves/venv/lib/python2.7/site-packages/psycopg2/_psycopg.so

linux-gate.so.1 =>  (0xb77da000)
libpq.so.5 => /usr/lib/libpq.so.5 (0xb7788000)
libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb776f000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7614000)
libssl.so.0.9.8 => /lib/i686/cmov/libssl.so.0.9.8 (0xb75cc000)
libcrypto.so.0.9.8 => /lib/i686/cmov/libcrypto.so.0.9.8 (0xb747a000)
libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0xb73c9000)
libcom_err.so.2 => /lib/libcom_err.so.2 (0xb73c5000)
libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0xb7395000)
libldap_r-2.4.so.2 => /usr/lib/libldap_r-2.4.so.2 (0xb734e000)
/lib/ld-linux.so.2 (0xb77db000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb734a000)
libz.so.1 => /lib/libz.so.1 (0xb7335000)
libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0xb7311000)
libkrb5support.so.0 => /usr/lib/libkrb5support.so.0 (0xb7308000)
libkeyutils.so.1 => /lib/libkeyutils.so.1 (0xb7304000)
libresolv.so.2 => /lib/tls/i686/cmov/libresolv.so.2 (0xb72f0000)
liblber-2.4.so.2 => /usr/lib/liblber-2.4.so.2 (0xb72e3000)
libsasl2.so.2 => /usr/lib/libsasl2.so.2 (0xb72cb000)
libgnutls.so.26 => /usr/lib/libgnutls.so.26 (0xb722f000)
libtasn1.so.3 => /usr/lib/libtasn1.so.3 (0xb721e000)
libgcrypt.so.11 => /lib/libgcrypt.so.11 (0xb71ab000)
libgpg-error.so.0 => /lib/libgpg-error.so.0 (0xb71a6000)

以下命令输出:
$ ls -l  /usr/lib/libpq*

-rw-r--r-- 1 root root 224904 2011-09-26 06:33 /usr/lib/libpq.a
lrwxrwxrwx 1 root root     12 2011-09-26 10:51 /usr/lib/libpq.so -> libpq.so.5.4
lrwxrwxrwx 1 root root     12 2011-09-26 10:51 /usr/lib/libpq.so.5 -> libpq.so.5.4
-rw-r--r-- 1 root root 150976 2011-09-26 06:33 /usr/lib/libpq.so.5.4

对我来说,一切似乎都是正确的。欢迎提出建议。
3个回答

4

您提到了“wsgi”标签。如果这意味着您正在使用Apache/mod_wsgi,则应注意,mod_wsgi必须针对相同的Python版本/安装进行编译,并且您需要验证mod_wsgi在运行时是否选择了与其链接的相同的libpython.so,因为mod_wsgi决定了链接的Python库。


是的,我正在使用apache/mod_wsgi。通过apt-get安装的。我会检查链接的库并在这里回复。谢谢。 - naoko
感谢您引导我走向正确的方向。以下是输出内容: $ ldd /usr/lib/apache2/modules/mod_wsgi.so linux-gate.so.1 => (0x00e3a000) libpython2.6.so.1.0 => /usr/lib/libpython2.6.so.1.0 (0x00178000) libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0x00668000) ..... 我的自定义安装2.7.2没有链接到libpython2.6... 我将研究推荐的Ubuntu 10.04 LST Python 2.7.2安装方法。 感谢您的帮助。 - naoko
在构建mod_wsgi时,将LD_RUN_PATH设置为环境变量,并将变量设置为实际目录,其中正确的.so文件驻留。有关详细信息,请参阅mod_wsgi网站。 - Graham Dumpleton

2
[SOLVED] 感谢patrys和Graham Dumpleton,他们让我明确了我的自定义构建Python 2.7和wsgi安装是错误的,并且缺少关键库链接。现在,通过以下指令,问题已经得到解决。感谢所有分享信息的聪明和善良的人。
1.重新安装Python:https://askubuntu.com/questions/17841/will-python2-7-be-available-for-lucid-in-future 2.然后卸载WSGI:sudo apt-get purge libapache2-mod-wsgi 3.安装WSGI:http://grok.zope.org/documentation/tutorial/installing-and-setting-up-grok-under-mod-wsgi/installing-and-configuring-mod-wsgi

1

这个特定的符号来自于libpython*.*.so.1.0(将通配符替换为您的Python版本)。使用nm列出动态符号时,您应该能看到它:

$ ldd /usr/lib64/python2.7/site-packages/psycopg2/_psycopg.so | grep libpython
libpython2.7.so.1.0 => /usr/lib64/libpython2.7.so.1.0 (0x00007fe14f0c6000)
$ nm -D /usr/lib64/libpython2.7.so.1.0 | grep PyObject_NextNotImplemented
000000000008a880 T _PyObject_NextNotImplemented

您是否使用自定义版本?看起来您的_psycopg.so版本根本没有与libpython链接。


是的,我自己构建...原帖中指定了2个选项。但确实缺少libpython... $ ldd venv/lib/python2.7/site-packages/psycopg2/_psycopg.so | grep libpython
没有返回任何内容...很奇怪,我的Ubuntu 11.04安装也没有链接到libpython,但它仍然可以工作...虽然我知道这与Python的构建方式有关...我会再研究一下,并找出正确的构建/安装方法,并在此发布更新
- naoko
正如我在回复中指出的那样,.so 文件链接到了 mod_wsgi。因此,您需要执行 ldd mod_wsgi.so 命令。请参阅 http://code.google.com/p/modwsgi/wiki/InstallationIssues#Lack_Of_Python_Shared_Library。 - Graham Dumpleton

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