2016-08-03 16 views
3

Ich benutze python-ldap innerhalb meiner Django Anwendung, und das hat immer gut funktioniert. Ich bin gerade dabei, eine ganze Reihe von Deps in meinem Projekt zu verbessern, indem ich Sachen umherbewege, die mit dem neuesten Django auf Alpin und Docker enden wollen.Notwendigkeit, Modul vorzumportieren, um Fehler zu vermeiden

Der Versuch, ./manage shell (oder irgendwelche anderen Verwaltungsbefehle) auszuführen, begann plötzlich, mir diesen Fehler zu geben;

... 
    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' funktioniert gut, ./manage.py shell -c 'import _ldap' barfs mit dem Fehler, der oben.

Fummeln herum, bemerkte ich, dass, wenn ich sehr früh, der Fehler ging import ldap.

Nach einer langen Reise von Editing und Debugging, habe ich festgestellt, dass, wenn ich if entry == 'django.contrib.postgres': import ldap vor https://github.com/django/django/blob/1.10/django/apps/config.py#L107 hinzufügen, wäre Django in der Lage, import ldap. module.default_app_config auf L107 ist django.contrib.postgres.apps.PostgresConfig (https://github.com/django/django/blob/1.10/django/contrib/postgres/apps.py#L10).

So offensichtlich, Postgres Import tut etwas. Aber was macht es mit ldap? Gibt es irgendwo eine Namenskollision? Wie kann ich weiter debuggen?

Ich will nicht die Lösung „nur ldap auf Ihre settings.py importieren“. Dies ist ein Fehler und sollte behoben werden.

  • Django: 1.10
  • Alpine: 3.4
  • Python: 2.7.12
  • psycopg2: 2.6.2
  • libpq: 9.5.3-r1
+1

Jedes Update auf das ?! –

+0

Nein. Ich habe immer noch eine "Import-ID" über meine Einstellungsdatei. Haben Sie noch weitere Debug-Informationen? – xeor

+0

Nicht wirklich, nahm ich, was Sie mir gaben und tat dies: https://gist.github.com/kingbuzzman/f32818da543bc2586d52ec52de8fa394 andere als das nein:/PS, danke für das Schnipsel: P –

Antwort

0

Ich arbeite auf Alpin: 3.4 Docker-Bild.

Sie müssen python-ldap von Tarball installieren.

$ 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 

Wenden Sie diesen Patch auf 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 

Wie Sie sehen können, wir sasl2, ssl und crypto zu libs nur lber hinzuzufügen.

Dann installieren python-ldap:

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

Quelle:

  • python-ldap FAQ