django PIL库中fcgi进程中的Python ctypes内存错误

vsnjm48y  于 2023-03-04  发布在  Go
关注(0)|答案(3)|浏览(121)

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

odopli941#

我已经临时修复了这个错误,注解了这个文件$HOME/lib/python2.7/ctypes/__init__.py中的最后一行,它类似于#CFUNCTYPE(c_int)(lambda: None)
这对我很有效,但我不知道到底是什么问题。

    • 更新**

在python2.7.3中,行号是:279,而不是我上面所说的最后一行。

    • UPDATE 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)
9bfwbjaz

9bfwbjaz2#

尝试运行此命令:

setsebool -P httpd_tmp_exec on

在CentOS上为我修复一些东西。摘自此帖子:https://bugzilla.redhat.com/show_bug.cgi?id=645193

oxcyiej7

oxcyiej73#

只是为了进一步解释eos 87的回答,这也确实解决了我的问题,从该行之前的注解来看,这听起来像是作为一个windows bug的变通方法添加的,但这个变通方法显然是自己造成了麻烦。

# 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运行时才会显示。

相关问题