Ich habe vor kurzem von Python 2.5 auf 2.7 aktualisiert (ich habe 2.6 während meiner Probleme versucht) und während alles von der Kommandozeile oder im Django runserver funktioniert, kann mod_wsgi kein Modul laden, das mit MSVC erstellte DLLs (pyd) enthält.Warum werden keine mit MSVC erstellten Python-DLLs mit mod_wsgi geladen?
Zum Beispiel, wenn ich meine eigenen Versionen von PyCrypto oder lxml bauen dann werde ich die folgende Fehlermeldung erhalten nur von mod_wsgi:
ImportError at/
DLL load failed: The specified module could not be found.
Selbst die offiziellen PIL-Binärdateien wird scheitern die _imaging C-Modul in mod_wsgi importieren aber das könnte ein anderes Problem sein.
Allerdings, wenn ich eine Version von pycrypto mit MinGW gebaut von irgendwo wie http://www.voidspace.org.uk/python/modules.shtml#pycrypto dann wird es auch in mod_wsgi fein importieren. Ich finde diese Lösung nicht zufriedenstellend, da ich Python komplett aktualisiert habe, um zu vermeiden, dass ich nach vorgefertigten Binärdateien suchen muss, und ich kann sie nicht selbst erstellen, weil MinGW> 50% der Zeit für mich ausfällt.
EDIT2: Ich bemerkte dies in Python27/Lib/distutils/msvc9compiler.py auf den Leitungen 680-705:
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
Das erklärt vermutlich, warum alles von der Kommandozeile aber nicht in mod_wsgi funktioniert. All dies zu kommen scheint das Problem zu beheben, fühlt sich aber nicht wie die richtige Lösung an. Die Frage ist jetzt, wo man msvcr90.dll setzen muss, damit Apache es benutzen kann? Ich stelle fest, dass Apache's bin-Ordner msvcr70.dll und msvcr80.dll enthält, aber das Hineingeben von 90 funktioniert nicht.
manifest Skipping entfernen für mich unter IIS auch mit Pyodbc – lambacck