python python-3.x ctypes ffi

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í.