2016-08-03 48 views
3

我在我的Django應用程序中使用python-ldap,並且一直工作正常。我目前正在升級我的項目中的很多代碼,這些代碼想要結束最新的高山和碼頭上的django。需要預先導入模塊,以避免錯誤

試圖執行./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上述錯誤。

擺弄,我注意到,如果我很早,我的錯誤就消失了。

經過長時間的編輯和調試,我發現如果在https://github.com/django/django/blob/1.10/django/apps/config.py#L107之前加上if entry == 'django.contrib.postgres': import ldap,django就能夠import ldap。 L107上的 module.default_app_configdjango.contrib.postgres.apps.PostgresConfighttps://github.com/django/django/blob/1.10/django/contrib/postgres/apps.py#L10)。

很明顯,postgres導入正在做一些事情。但是,它對ldap做了什麼?有沒有名稱相撞的地方?我如何進一步調試?

我不想要「只需在您的settings.py之上導入ldap」的解決方案。這是一個錯誤,應該修復。

  • 的Django:1.10
  • 高山: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

我的工作在高山上:3.4 Docker圖像。您需要從tarball安裝python-ldap

$ 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 

正如你所看到的,我們只需要添加lbersasl2sslcryptolibs

然後,安裝python-ldap

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

來源:

  • 蟒蛇,LDAP FAQ