Python ctypes MemoryError в процессе fcgi из библиотеки PIL
Я пытаюсь запустить Django на общем хостинге (Bluehost). Я использую функциональность, которая требует PIL. PIL импортирует и работает из интерактивной оболочки, но в моем процессе fcgi он вылетает с MemoryError из изображения импорта PIL. Любая помощь в том, почему это может быть неудачно внутри fcgi, будет очень оценено.
__Environment Info__:
Python2.7
Local installs of libjpg, zlib, freetype, and lcms
Virtualenv:
Django 1.3, PIL, flup, etc.
__Stack Trace__:
File ".../feincms_thumbnail.py", line 3, in <module>
from PIL import Image
File ".../PIL/Image.py", line 45, in <module>
\__import__("FixTk")
File ".../python2.7/lib-tk/FixTk.py", line 15, in <module>
import ctypes
File ".../python2.7/ctypes/__init__.py", line 549, in <module>
CFUNCTYPE(c_int)(lambda: None)
__.fcgi__:
<!-- language: python -->
# setup paths
# set DJANGO_SETTINGS_MODULE in os.environ
from django.core.servers.fastcgi import runfastcgi
runfastcgi(method="threaded", daemonize="false")
Ответы
Ответ 1
Я временно исправил эту ошибку, комментируя последнюю строку в этом файле $HOME/lib/python2.7/ctypes/__init__.py
, что-то вроде #CFUNCTYPE(c_int)(lambda: None)
.
Это работает для меня, но я не знаю, в чем проблема.
UPDATE
В python 2.7.3 номер строки: 279 не последний, как я сказал выше.
ОБНОВЛЕНИЕ 2
Поскольку строка может варьироваться в зависимости от второстепенных версий, вы должны искать фрагмент кода, который выглядит примерно так:
# XXX for whatever reasons, creating the first instance of a callback
# function is needed for the unittests on Win64 to succeed. This MAY
# be a compiler bug, since the problem occurs only when _ctypes is
# compiled with the MS SDK compiler. Or an uninitialized variable?
CFUNCTYPE(c_int)(lambda: None)
Ответ 2
Просто для того, чтобы немного расшириться на eos87, это исправляет проблему и для меня, и, судя по комментарию до этой строки, похоже, что она была добавлена как обходной путь к ошибке Windows, но обходной путь, по-видимому, вызывая собственные проблемы. Здесь бит в конце __init__.py
:
# XXX for whatever reasons, creating the first instance of a callback
# function is needed for the unittests on Win64 to succeed. This MAY
# be a compiler bug, since the problem occurs only when _ctypes is
# compiled with the MS SDK compiler. Or an uninitialized variable?
CFUNCTYPE(c_int)(lambda: None)
Похоже, что это безопасно удалять.
FWIW, эта проблема появилась для меня в поле Centos 5.7 x64 при использовании установленного python 2.6 (параллельно с python 2.4) из epel. Файл был найден здесь: /usr/lib64/python2.6/ctypes/__init__.py
Также обратите внимание, что появившееся исключение - это MemoryError, который согласно strace
сразу после вызова munmap
выводится из-за ошибки сегментации (хотя, возможно, по совпадению); и он появляется только при работе в FastCGI.
Ответ 3
попробуйте запустить эту команду:
setsebool -P httpd_tmp_exec on
исправляет для меня вещи в CentOS. Взято с этой должности:
https://bugzilla.redhat.com/show_bug.cgi?id=645193