apache2 + mod_wsgi 的soaplib(lxml)问题

Posted

技术标签:

【中文标题】apache2 + mod_wsgi 的soaplib(lxml)问题【英文标题】:problem with soaplib (lxml) with apache2 + mod_wsgi 【发布时间】:2011-07-29 23:00:34 【问题描述】:

当我使用 apache2+modwsgi 启动我的应用程序时 我抓住了

异常类型:ImportError 异常值:DLL 加载失败:找不到指定的模块。

排队

从 lxml 导入 etree

使用 Django 开发服务器一切正常 已安装 Visual C++ Redistributable 2008

Dependency walker 告诉 msvcrt90.dll 丢失 但是 cx_Oracle 也有同样的情况,但是 cx_Oracle 的 dll 加载正确

有什么想法吗?

windows 2003 server 64bit 和 windows XP sp3 32bit 蟒蛇2.7 32位 cx_Oracle 5.0.4 32位

UPD: 下载 libxml2-2.7.7 和 libxslt-1.1.26

尝试使用 setup.py build --compiler mingw32 构建

构建 lxml 2.3 版。 使用 Cython 0.14.1 构建。 错误:'xslt-config' 未被识别为内部或外部命令, 可运行的程序或批处理文件。 ** 确保已安装 libxml2 和 libxslt 的开发包 ** 使用 libxslt 的构建配置 运行构建 运行 build_py 运行 build_ext 跳过 'src/lxml\lxml.etree.c' Cython 扩展(最新) 构建“lxml.etree”扩展 C:\MinGW\bin\gcc.exe -mno-cygwin -mdll -O -Wall -IC:\Python27\include -IC:\Python27\PC -c src/lxml\lxml.etree.c -o build\temp .win32-2.7\Release\src\lxml\lxml.et ree.o -w 编写 build\temp.win32-2.7\Release\src\lxml\etree.def C:\MinGW\bin\gcc.exe -mno-cygwin -shared -s build\temp.win32-2.7\Release\src\lxml\lxml.etree.o build\temp.win32-2.7\Release\src\lxml \etree.def -LC:\Python27\lib s -LC:\Python27\PCbuild -llibxslt -llibexslt -llibxml2 -liconv -lzlib -lWS2_32 -lpython27 -lmsvcr90 -o build\lib.win32-2.7\lxml\etree.pyd build\temp.win32-2.7\Release\src\lxml\lxml.etree.o:lxml.etree.c:(.text+0xd11): 未定义引用`_imp__xmlFree' build\temp.win32-2.7\Release\src\lxml\lxml.etree.o:lxml.etree.c:(.text+0xd24): 未定义引用`_imp__xmlFree' build\temp.win32-2.7\Release\src\lxml\lxml.etree.o:lxml.etree.c:(.text+0x1ee92): 未定义引用`_imp__xmlFree' build\temp.win32-2.7\Release\src\lxml\lxml.etree.o:lxml.etree.c:(.text+0x1eed6): 未定义引用`_imp__xmlFree' build\temp.win32-2.7\Release\src\lxml\lxml.etree.o:lxml.etree.c:(.text+0x2159e): 未定义引用`_imp__xmlMalloc' build\temp.win32-2.7\Release\src\lxml\lxml.etree.o:lxml.etree.c:(.text+0x2e741): 未定义引用`_imp__xmlFree' build\temp.win32-2.7\Release\src\lxml\lxml.etree.o:lxml.etree.c:(.text+0x2e784): 未定义引用`_imp__xmlFree' build\temp.win32-2.7\Release\src\lxml\lxml.etree.o:lxml.etree.c:(.text+0x3f157): 未定义引用`_imp__xmlFree' build\temp.win32-2.7\Release\src\lxml\lxml.etree.o:lxml.etree.c:(.text+0x3f19a): 未定义引用`_imp__xmlFree' build\temp.win32-2.7\Release\src\lxml\lxml.etree.o:lxml.etree.c:(.text+0x3f4ac): 未定义引用`_imp__xmlFree' build\temp.win32-2.7\Release\src\lxml\lxml.etree.o:lxml.etree.c:(.text+0x3f4ef):更多未定义的对 `_imp__xmlFree' 的引用如下 build\temp.win32-2.7\Release\src\lxml\lxml.etree.o:lxml.etree.c:(.text+0xb1ad5):未定义对“xsltLibxsltVersion”的引用 build\temp.win32-2.7\Release\src\lxml\lxml.etree.o:lxml.etree.c:(.text+0xb1b9a):未定义对“xsltDocDefaultLoader”的引用 collect2: ld 返回 1 个退出状态 错误:命令“gcc”失败,退出状态为 1

UPD2: 我明白为什么 import cx_Oracle 工作正常:cx_Oracle.pyd 包含“MSVCRT.dll”依赖 etree.pyd 没有它

【问题讨论】:

【参考方案1】:

确实是因为'msvcrt90.dll'。从 Python 2.6 的微补丁修订版的某个地方开始,他们停止为扩展模块构建对 DLL 的自动依赖项,并依赖 Python 可执行文件来执行此操作。但是,当嵌入到其他系统中时,您将依赖于链接到 DLL 的可执行文件,而在 Apache 的情况下则不然。因此,Python 的变化破坏了许多在 Windows 上嵌入 Python 的系统,唯一的解决方案是让每个扩展模块都对所需的 DLL 有自己的依赖关系,而很多人没有。 psycopg2 扩展受到了严重影响,他们现在已经更改了构建以将依赖项添加回自己。您可能会搜索 psycopg2 发生的问题。解决方案之一是在 Windows 上使用 MinGW 编译器重建扩展。

【讨论】:

以上是关于apache2 + mod_wsgi 的soaplib(lxml)问题的主要内容,如果未能解决你的问题,请参考以下文章

我在哪里可以获得 apache2/module 的 mod_wsgi.so 文件?

使用 apache2 在 mod_wsgi 上运行 django python 3.4

Django + mod_wsgi + apache2 - 子进程 XXX 仍然没有退出,发送一个 SIGTERM

将 apache2 摘要身份验证信息传递给由 mod_wsgi 运行的 wsgi 脚本

如何部署Apache2+mod_wsgi+flask?

使用 mod_wsgi 在 Ubuntu 16.04 apache2 上部署 Django 应用程序