2016-08-03 2 views
3

Я использую python-ldap внутри моего приложения Django и который всегда работал нормально. В настоящее время я нахожусь в процессе обновления большого количества депо в моем проекте, перемещая вещи вокруг, желая закончить с последним django на alpine и docker.Нужно предварительно импортировать модуль, чтобы избежать ошибки

Попытка выполнить ./manage shell (или любые другие команды управления) внезапно начала давать мне эту ошибку;

... 
    File "/usr/lib/python2.7/site-packages/ldap/__init__.py", line 22, in <module> 
    import _ldap 
ImportError: Error relocating /usr/lib/python2.7/site-packages/_ldap.so: ber_free: symbol not found 

python -c 'import _ldap' работает отлично, ./manage.py shell -c 'import _ldap' barfs с ошибкой выше.

Скриншот, я заметил, что если я import ldap очень рано, ошибка исчезла.

После долгого пути редактирования и отладки я обнаружил, что если я добавлю if entry == 'django.contrib.postgres': import ldap до https://github.com/django/django/blob/1.10/django/apps/config.py#L107, django сможет import ldap. module.default_app_config на L107 - django.contrib.postgres.apps.PostgresConfig (https://github.com/django/django/blob/1.10/django/contrib/postgres/apps.py#L10).

Так что, очевидно, импорт postgres делает что-то. Но что он делает с ldap? Есть где-то столкновение имен? Как я могу отлаживать дальше?

Я не хочу, чтобы решение «просто импортировать ldap поверх settings.py». Это ошибка, и она должна быть исправлена.

  • Джанго: 1,10
  • Alpine: 3,4
  • Python: 2.7.12
  • psycopg2: 2.6.2
  • libpq: 9.5.3-r1
+1

Любое изменение на это ?! –

+0

Нет. У меня все еще есть «import ldap» поверх моего файла настроек. У вас есть дополнительная информация об отладке? – xeor

+0

Не совсем, я взял то, что вы мне дали, и сделал это: https://gist.github.com/kingbuzzman/f32818da543bc2586d52ec52de8fa394 кроме этого нет:/PS, спасибо за фрагмент: P –

ответ

0

Я работаю на Alpine: 3.4 Изображение докера.

Вам необходимо установить python-ldap из tarball.

$ wget https://pypi.python.org/packages/8b/f3/8122b9d8999a67293a5a236f4b9eda009dce76835bb854fb848b1133dbe0/python-ldap-2.4.39.tar.gz 
$ tar -xvf python-ldap-2.4.39.tag.gz 
$ cd python-ldap-2.4.39 

Примените этот патч на setup.cfg:

--- setup.cfg 
+++ setup.cfg.patch 
@@ -2,9 +2,9 @@ 
library_dirs = /usr/lib /usr/lib64 /usr/local/lib /usr/local/lib64 
include_dirs = /usr/include /usr/include/sasl /usr/local/include /usr/local/include/sasl 
defines = HAVE_SASL HAVE_TLS HAVE_LIBLDAP_R 
-extra_compile_args = 
+extra_compile_args = -g 
extra_objects = 
-libs = ldap_r 
+libs = ldap_r lber sasl2 ssl crypto 

[install] 
compile = 1 

Как вы можете видеть, мы просто добавим lber, sasl2, ssl и crypto к libs.

Затем установите python-ldap:

# python setup.py build 
# python setup.py install 

Источник:

  • питон-LDAP FAQ
Смежные вопросы