J'ai récemment mis à jour de Python 2.5 à 2.7 (j'ai essayé 2.6 pendant mes tracas) et bien que tout fonctionne correctement depuis la ligne de commande ou dans le serveur Django, mod_wsgi ne peut charger aucun module contenant des DLLs.Pourquoi les DLL Python créées avec MSVC ne sont-elles pas chargées avec mod_wsgi?
Par exemple, si je construis mes propres versions de pycrypto ou lxml alors je vais obtenir l'erreur suivante seulement de mod_wsgi:
ImportError at/
DLL load failed: The specified module could not be found.
Même les binaires LIP officiels ne parviennent pas à importer le module _imaging C dans mod_wsgi mais cela peut être un autre problème.
Cependant, si j'utilise une version de pycrypto construite avec MinGW à partir de quelque chose comme http://www.voidspace.org.uk/python/modules.shtml#pycrypto alors il importera bien même dans mod_wsgi. Je ne trouve pas cette solution satisfaisante bien que la raison pour laquelle j'ai mis à jour Python était d'éviter de chercher des binaires précompilés et je ne peux pas les construire moi-même car MinGW échoue> 50% du temps pour moi.
EDIT2: Je l'ai remarqué dans Python27/Lib/distutils/msvc9compiler.py sur les lignes 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
Cela explique probablement pourquoi tout fonctionne à partir de la ligne de commande, mais pas dans mod_wsgi. Commenter tout cela semble résoudre le problème, mais ne se sent pas comme le correctif approprié. La question est maintenant de savoir où mettre msvcr90.dll afin qu'Apache puisse l'utiliser? Je remarque que le dossier de bin d'Apache contient msvcr70.dll et msvcr80.dll mais en mettant 90 dedans là ne fonctionne pas.
Skipping supprimer manifeste a fonctionné pour moi aussi sous IIS avec pyodbc – lambacck