Recientemente actualicé desde Python 2.5 a 2.7 (probé 2.6 durante mis molestias) y aunque todo funciona bien desde la línea de comandos o en el servidor de ejecución de Django, mod_wsgi no puede cargar ningún módulo que contenga DLL (pyd) creado con MSVC.¿Por qué las DLL de Python creadas con MSVC no se cargan con mod_wsgi?
Por ejemplo, si construyo mis propias versiones de pycrypto o lxml entonces voy a obtener el siguiente error sólo de mod_wsgi:
ImportError at/
DLL load failed: The specified module could not be found.
Incluso los binarios oficiales PIL dejarán de importar el módulo _imaging C en mod_wsgi pero ese puede ser otro problema.
Sin embargo, si uso una versión de pycrypto creada con MinGW desde algún lugar como http://www.voidspace.org.uk/python/modules.shtml#pycrypto, entonces importará bien incluso en mod_wsgi. No creo que esta solución sea satisfactoria, ya que la razón por la que actualicé Python fue para evitar tener que buscar binarios precompilados y no puedo crearlos yo mismo porque MinGW falla> 50% del tiempo para mí.
Edit2: me di cuenta de esto en python27/lib/distutils/msvc9compiler.py en las líneas 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
Esto probablemente explica por qué todo funciona desde la línea de comandos, pero no en mod_wsgi. Comentar todo esto parece solucionar el problema, pero no parece la solución adecuada. La pregunta ahora es dónde poner msvcr90.dll para que Apache pueda usarlo? Observé que la carpeta bin de Apache contiene msvcr70.dll y msvcr80.dll pero poner 90 allí no funciona.
Saltarse eliminar manifiesta trabajó para mí demasiado bajo IIS con pyodbc – lambacck