Вопрос по ffi, python-3.x, ctypes, python – Замена Python 3 для PyFile_AsFile
Следующий код работает в 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))
Но в Python 3 в pythonapi нет PyFile_AsFile.
Код является исключением изtestPixelOps.py.
* ctypes, чтобы я мог передать его в GD.
Вам не повезло. Это было возможно в Python 2.x, но невозможно в Python 3.x.документация объясняет почему нет:
Эти API-интерфейсы являются минимальной эмуляцией Python 2 C API для встроенных файловых объектов, которые использовались для поддержки буферизованного ввода-вывода (FILE *) из стандартной библиотеки C. В Python 3 файлы и потоки используют новый модуль io, который определяет несколько уровней над небуферизованным небуферизованным вводом-выводом операционной системы.
Если вы хотитеFILE*
вам придется создать его самостоятельно, используя стандартную библиотеку C напрямую.
не могу найти реального ответа на проблему, но я узнал, что если вы ненеобходимо преобразовать объект файла Python вFILE*
(т.е. вы нене надо "доля" открытый файл), вы можете просто использоватьctypes
звонитьfopen
отlibc
и получитьFILE*
как это.
fopen
отlibc
, Благодарю.
Rafa