需要预先导入模块以避免错误

时间:2016-08-03 10:11:13

标签: python django python-ldap

我在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_configdjango.contrib.postgres.apps.PostgresConfighttps://github.com/django/django/blob/1.10/django/contrib/postgres/apps.py#L10)。

很明显,postgres import正在做点什么。但它与ldap有什么关系呢?某处有名字碰撞吗?我该如何进一步调试?

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

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

2 个答案:

答案 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

如您所见,我们只需将lbersasl2sslcrypto添加到libs

然后,安装python-ldap

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

来源:

  • python-ldap FAQ

答案 1 :(得分:0)

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