我在python-ldap
应用程序中使用Django
并且一直运行良好。我目前正在升级我项目中的许多代表,希望最终得到最新的高山和码头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,错误如上。
摆弄,我注意到,如果我import ldap
很早,错误消失了。
经过漫长的编辑和调试之后,我发现如果我在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_config
为django.contrib.postgres.apps.PostgresConfig
(https://github.com/django/django/blob/1.10/django/contrib/postgres/apps.py#L10)。
很明显,postgres import正在做点什么。但它与ldap有什么关系呢?某处有名字碰撞吗?我该如何进一步调试?
我不想要“只在您的settings.py
之上导入ldap”的解决方案。这是一个错误,应该修复。
答案 0 :(得分:0)
我正在开发Alpine: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
如您所见,我们只需将lber
,sasl2
,ssl
和crypto
添加到libs
。
然后,安装python-ldap
:
# python setup.py build
# python setup.py install
来源:
答案 1 :(得分:0)
我刚刚碰到这个并将python-ldap升级到最新版本(3.0.0)解决了这个问题,因为includes在另一个答案中描述了修复。