3

python-ldap在我的Django应用程序中使用,并且一直运行良好。我目前正在升级我的项目中的许多部门,以期在 alpine 和 docker 上使用最新的 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'出现上述错误。

摆弄,我注意到如果我import ldap很早,错误就消失了。

经过长时间的编辑和调试,我发现如果我在https://github.com/django/django/blob/1.10/django/apps/config.py#L107if entry == 'django.contrib.postgres': import ldap之前添加,django 就可以. 在 L107 上是(https://github.com/django/django/blob/1.10/django/contrib/postgres/apps.py#L10)。import ldapmodule.default_app_configdjango.contrib.postgres.apps.PostgresConfig

很明显,postgres import 正在做一些事情。但是它用 ldap 做什么呢?某处是否存在名称冲突?如何进一步调试?

我不想要“只在你的上面导入 ldap”的解决方案settings.py。这是一个错误,应该修复。

  • 姜戈:1.10
  • 高山:3.4
  • 蟒蛇:2.7.12
  • psycopg2:2.6.2
  • libpq:9.5.3-r1
4

2 回答 2

0

我刚刚碰到这个并将 python-ldap 升级到最新版本(3.0.0)解决了这个问题,因为它包括另一个答案中描述的修复。

于 2018-04-06T07:47:56.953 回答
0

我正在研究 Alpine:3.4 Docker 映像。

您需要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和。sslcryptolibs

然后,安装python-ldap

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

资源:

于 2017-06-20T02:31:32.453 回答