Python从PIL库中ccpes fcgi进程中的MemoryError

时间:2011-05-06 17:00:54

标签: python django python-imaging-library fastcgi

我正在尝试在共享主机(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")

3 个答案:

答案 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运行时显示。