Недавно я обновил Python 2.5 до 2.7 (я пробовал 2.6 во время моих проблем), и хотя все работает нормально из командной строки или в Django runserver, mod_wsgi не может загрузить какой-либо модуль, содержащий библиотеки DLL (pyd), созданные с помощью MSVC.
Например, если я создаю свои собственные версии pycrypto или lxml, то только от mod_wsgi я получу следующую ошибку:
ImportError at /
DLL load failed: The specified module could not be found.
Даже официальные двоичные файлы PIL не смогут импортировать модуль _imaging C в mod_wsgi, но это может быть другой проблемой.
Однако, если я использую версию pycrypto, созданную с помощью MinGW, откуда-то вроде http: // www.voidspace.org.uk/python/modules.shtml#pycrypto, тогда он будет отлично импортировать даже в mod_wsgi. Я не нахожу это решение удовлетворительным, поскольку вся причина, по которой я обновил Python, заключалась в том, чтобы избежать необходимости искать готовые двоичные файлы, и я не могу их собрать самостоятельно, потому что MinGW не работает для меня> 50% времени.
EDIT2: Я заметил это в Python27 / Lib / distutils / msvc9compiler.py в строках 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""" |)""",
re.DOTALL)
manifest_buf = re.sub(pattern, "", manifest_buf)
pattern = "\s* "
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
Это, вероятно, объясняет, почему все работает из командной строки, но не из mod_wsgi. Комментирование всего этого, кажется, решает проблему, но не кажется правильным решением. Теперь вопрос в том, куда положить msvcr90.dll, чтобы Apache мог его использовать? Я заметил, что папка bin Apache содержит msvcr70.dll и msvcr80.dll, но поместить туда 90 не работает.