为什么没有使用MSVC构建的Python DLL使用mod_wsgi加载?

为什么没有使用MSVC构建的Python DLL使用mod_wsgi加载?,python,visual-c++,mod-wsgi,Python,Visual C++,Mod Wsgi,我最近从Python2.5更新到了2.7(我在麻烦中尝试了2.6),虽然在命令行或Django runserver中一切正常,但mod_wsgi无法加载任何包含用MSVC构建的DLL(pyd)的模块 例如,如果我构建自己的pycrypto或lxml版本,那么我将仅从mod_wsgi获得以下错误: ImportError at / DLL load failed: The specified module could not be found. 即使是官方的PIL二进制文件也无法在mod_wsg

我最近从Python2.5更新到了2.7(我在麻烦中尝试了2.6),虽然在命令行或Django runserver中一切正常,但mod_wsgi无法加载任何包含用MSVC构建的DLL(pyd)的模块

例如,如果我构建自己的pycrypto或lxml版本,那么我将仅从mod_wsgi获得以下错误:

ImportError at /
DLL load failed: The specified module could not be found.
即使是官方的PIL二进制文件也无法在mod_wsgi中导入_ImagingC模块,但这可能是另一个问题

然而,如果我使用从类似的地方用MinGW构建的pycrypto版本,那么即使在mod_wsgi中也可以很好地导入。不过,我觉得这个解决方案并不令人满意,因为我更新Python的全部原因是为了避免寻找预构建的二进制文件,而我自己无法构建它们,因为MinGW在我看来失败的时间超过50%

编辑2: 我在第680-705行的Python27/Lib/distutils/msvc9compiler.py中注意到了这一点:

try:
    # Remove references to the Visual C runtime, so they will
    # fall through to the Visual C dependency of Python.exe.
    # This way, when installed for a restricted user (e.g.
    # runtimes are not in WinSxS folder, but in Python's own
    # folder), the runtimes do not need to be in every folder
    # with .pyd's.
    manifest_f = open(manifest_file)
    try:
        manifest_buf = manifest_f.read()
    finally:
        manifest_f.close()
    pattern = re.compile(
        r"""<assemblyIdentity.*?name=("|')Microsoft\."""\
        r"""VC\d{2}\.CRT("|').*?(/>|</assemblyIdentity>)""",
        re.DOTALL)
    manifest_buf = re.sub(pattern, "", manifest_buf)
    pattern = "<dependentAssembly>\s*</dependentAssembly>"
    manifest_buf = re.sub(pattern, "", manifest_buf)
    manifest_f = open(manifest_file, 'w')
    try:
        manifest_f.write(manifest_buf)
    finally:
        manifest_f.close()
except IOError:
    pass
试试看:
#删除对Visual C运行时的引用,以便它们
#转到Python.exe的Visual C依赖项。
#这样,当为受限用户安装时(例如。
#运行时不在WinSxS文件夹中,而是在Python自己的文件夹中
#文件夹),运行时不需要位于每个文件夹中
#和派德一起。
清单f=打开(清单文件)
尝试:
manifest\u buf=manifest\u f.read()
最后:
舱单关闭()
模式=重新编译(

r“”“虽然我对mod_wsgi一无所知,但我敢猜测最可能的原因是缺少运行时依赖项。您可能希望使用MSVC附带的依赖项Walker检查您的MSVC构建(例如,在MSVC 2005中,它位于\Common7\Tools\Bin\dependens.Exe)。它将显示二进制文件需要哪些DLL

作为另一种解决方法,应该可以使用静态链接的运行时构建模块(请参见项目属性->C/C++->代码生成->运行时--选择“多线程”(而不是“多线程DLL”);或者,如果从命令行构建,请确保使用/MT,而不是/MD)。但是,如果运行时相关的内容(例如文件*对象)跨越模块边界,则可能会出现问题

UPD如果您安装了正确的VC redist,原因可能是SxS配置有问题(即.pyd本身的清单错误或缺失,或者与加载.pyd的应用程序的清单冲突)。您可以使用
sxstrace
实用程序查看具体情况。请参阅


另外,您是否尝试了运行时的静态链接?或者,更好的是,检查主机进程的要求。

我遇到了类似的问题,并最终找到了一个解决方案:从下载/更新apache服务器。

我在zmq中遇到了这个错误。解决方案是在libzmq.pyd-fi中包含python27.dll清单le(它很可能适用于其他pyd/dll)。请确保使用全部64位或全部32位

"C:\Program Files (x86)\Windows Kits\8.0\bin\x64\mt.exe" -inputresource:C:\windows\system32\python27.dll;#2 -outputresource:libzmq.pyd;#2

请参见

它们缺少MSVCR90.DLL(以及GPSVC和IESHIMS)。我将MSVCR90.DLL放在AES.pyd和Dependency Walker Pass旁边,但Apache给出了一个运行时错误。我确实有VC redist,MSVCR90.DLL在C:\Windows\winsxs下的不同文件夹中。有什么想法吗?我编辑了原始问题以显示AES.pyd是如何实际构建的。它会作为一个注释被破坏。@Kyle MacFarlane-我编辑了我的answer在回复评论时,我再次编辑了这个问题。对它目前的状况有什么看法吗?跳过删除清单对我在IIS下使用pyodbc也有效