11 Stimmen

Python ctypes MemoryError in fcgi-Prozess aus PIL-Bibliothek

Ich versuche, Django auf Shared Hosting (Bluehost) laufen zu lassen. Ich verwende eine Funktionalität, die PIL erfordert. PIL importiert und funktioniert von einer interaktiven Shell, aber in meinem fcgi-Prozess stürzt es mit einem MemoryError bei from PIL import image ab. Jede Hilfe, warum es innerhalb von fcgi scheitern könnte, würde sehr geschätzt werden.

__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")

25voto

eos87 Punkte 8261

Ich habe diesen Fehler vorübergehend behoben, indem ich die letzte Zeile in dieser Datei kommentiert habe $HOME/lib/python2.7/ctypes/__init__.py Das ist etwa so #CFUNCTYPE(c_int)(lambda: None) .

Das funktioniert bei mir, aber ich weiß nicht, was genau das Problem ist.

UPDATE

In Python 2.7.3 ist die Zeilennummer :279 und nicht die letzte, wie ich oben sagte.

UPDATE 2 Da die Zeile in den verschiedenen Unterversionen variieren kann, sollten Sie nach einem Codestück suchen, das etwa so aussieht:

# 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)

3voto

Adam Spence Punkte 2690

Versuchen Sie, diesen Befehl auszuführen:

setsebool -P httpd_tmp_exec on

behebt Dinge für mich unter CentOS. Entnommen aus diesem Beitrag: https://bugzilla.redhat.com/show_bug.cgi?id=645193

2voto

tylerl Punkte 29162

Um die Antwort von eos87 ein wenig zu ergänzen: Auch bei mir ist das Problem damit behoben, und nach dem Kommentar vor dieser Zeile zu urteilen, klingt es so, als sei es als Abhilfe für einen Windows-Fehler hinzugefügt worden, aber die Abhilfe verursacht offenbar selbst Probleme. Hier ist die Stelle am Ende von __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)

Es sieht so aus, als ob es sicher zu entfernen ist.

FWIW, dieses Problem zeigte sich für mich auf einer Centos 5.7 x64 Box bei der Verwendung von Python 2.6 als installiert (parallel mit Python 2.4) von epel . Die Datei wurde hier gefunden: /usr/lib64/python2.6/ctypes/__init__.py

Beachten Sie auch, dass die Ausnahme, die angezeigt wird, ein MemoryError ist, der laut strace resultiert aus einem Segmentierungsfehler unmittelbar (wenn auch vielleicht zufällig) nach einem Aufruf von munmap und es wird nur angezeigt, wenn es als FastCGI läuft.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X