我正在尝试在共享主机(Bluehost)上运行Django。我正在使用需要PIL的功能。 PIL从交互式shell导入和工作,但是在我的fcgi进程中,它从PIL导入映像中的MemoryError崩溃。任何有关为什么它可能在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")
答案 0 :(得分:23)
我已暂时修正了错误,评论此文件$HOME/lib/python2.7/ctypes/__init__.py
中的最后一行,如#CFUNCTYPE(c_int)(lambda: None)
。
这对我有用,但我不知道究竟是什么问题。
<强>更新强>
在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)
答案 1 :(得分:3)
尝试运行此命令:
setsebool -P httpd_tmp_exec on
在CentOS上为我修复了一些问题。摘自这篇文章: https://bugzilla.redhat.com/show_bug.cgi?id=645193
答案 2 :(得分:2)
只是为了扩展eos87的答案,这确实也解决了我的问题,并且在该行之前的评论判断,它听起来像是作为一个变通方法添加到Windows bug,但解决方法显然造成自己的麻烦。这是__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,当使用epel安装的python 2.6(与python 2.4并行)时,这个问题出现在Centos 5.7 x64盒子上。该文件位于:/usr/lib64/python2.6/ctypes/__init__.py
另请注意,显示的异常是一个MemoryError,它根据strace
在调用munmap
后立即(尽管可能是巧合地)产生了分段错误;它只在以FastCGI运行时显示。