Reemplazo de Python 3 para PyFile_AsFile
python-3.x ctypes (2)
Solo necesitaba una forma de convertir un objeto de archivo a un archivo ctypes * para poder pasarlo a GD.
Estás fuera de suerte. Eso fue posible en Python 2.x, pero no es posible en Python 3.x. La documentación explica por qué no:
Estas API son una emulación mínima de Python 2 C API para objetos de archivos integrados, que solían confiar en el soporte de E / S en búfer (FILE *) de la biblioteca estándar de C. En Python 3, los archivos y las secuencias utilizan el nuevo módulo io, que define varias capas sobre las E / S sin búfer de bajo nivel del sistema operativo.
Si desea un FILE*
, tendrá que hacer uno usted mismo, utilizando la biblioteca estándar C directamente.
El siguiente código funciona en Python 2:
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))
Pero en Python 3, no hay PyFile_AsFile en pythonapi.
El código es un excepto de testPixelOps.py .
No encontré una respuesta real al problema, pero descubrí que si no necesita convertir el objeto de archivo de Python a un FILE*
(es decir, no necesita "compartir" el archivo abierto), simplemente puede usar ctypes
para llamar a fopen
desde libc
y obtener el FILE*
así.