Ошибка «неопределенный символ: _PyObject_NextNotImplemented» при загрузке модуля psycopg2 - PullRequest
4 голосов
/ 27 сентября 2011
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 и при попытке загрузить psycopg2 из Django, я получил следующую ошибку (я не получил эту ошибку 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 голосов
/ 27 сентября 2011

Вы упоминаете 'wsgi' как тег. Если это означает, что вы используете Apache / mod_wsgi, то имейте в виду, что mod_wsgi должен быть скомпилирован с той же версией / установкой Python, и вам нужно убедиться, что mod_wsgi получает тот же libpython.so во время выполнения, так как это mod_wsgi, который определяет Python библиотека, связанная с.

2 голосов
/ 27 сентября 2011

[решено] Благодаря Патрису и Грэму Дамплтону стало ясно, что моя пользовательская сборка 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 голос
/ 27 сентября 2011

Этот конкретный символ происходит от 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.

...