2013-04-21 12 views
6

Der folgende Code in Python arbeitet 2:Python 3 Ersatz für PyFile_AsFile

from ctypes import * 

## Setup python file -> c 'FILE *' conversion : 
class FILE(Structure): 
    pass 
FILE_P = POINTER(FILE) 
PyFile_AsFile = pythonapi.PyFile_AsFile # problem here 
PyFile_AsFile.argtypes = [py_object] 
PyFile_AsFile.restype = FILE_P 
fp = open(filename,'wb') 
gd.gdImagePng(img, PyFile_AsFile(fp)) 

Aber in Python 3, gibt es keine PyFile_AsFile in pythonapi.

Der Code ist eine Ausnahme von testPixelOps.py.

+0

Sieht so aus, als gäbe es hier eine Lösung (http://www.salstar.sk/pub/svplayer/vlc.py), aber für mich ist das ein Fehler. –

+0

Ah, ich weiß, warum es segfauliert. Ich benutzte den Dateideskriptor als eine Datei * ... –

+0

Es ist völlig in Ordnung, Ihre eigene Frage zu beantworten und zu akzeptieren, wenn es natürlich keine anderen besseren Antworten gibt – jamylak

Antwort

9

Ich brauchte nur einen Weg, um ein Dateiobjekt in ein ctypes FILE * zu konvertieren, so dass ich es an GD übergeben kann.

Sie haben kein Glück. Das war in Python 2.x möglich, ist aber in Python 3.x nicht möglich. Die documentation erklärt, warum nicht:

Diese APIs eine minimale Emulation der Python 2 C-API für integrierte Datei-Objekte sind, die auf der gepufferten I/O (FILE *) Unterstützung von dem C-Standard beruhen verwende Bibliothek. In Python 3 verwenden Dateien und Streams das neue io-Modul, das mehrere Layer über die ungepufferten Low-Level-I/O des Betriebssystems definiert.

Wenn Sie eine FILE* möchten, müssen Sie eine selbst erstellen, indem Sie die C-Standardbibliothek direkt verwenden.

+0

Danke David, ich war dumm, weil ich den Header dieser Doc-Seite nicht gelesen habe. –

2

Ich habe keine echte Antwort auf das Problem gefunden, aber ich habe herausgefunden, dass, wenn Sie das Python-Dateiobjekt nicht in eine FILE* konvertieren müssen (dh Sie müssen nicht geöffnet "geöffnet" Datei), können Sie einfach ctypes verwenden, fopen von libc aufrufen und die FILE* so erhalten.

+1

Und [diese Antwort] (http://StackOverflow.com/A/17257911) zeigt, wie 'fopen' von' libc' aufgerufen wird. Vielen Dank. – Rafa