The following code works in 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))
But in Python 3, there is no PyFile_AsFile in pythonapi.
The code is an except from testPixelOps.py.
You are out of luck. That was possible in Python 2.x, but is not possible in Python 3.x. The documentation explains why not:
If you want a
FILE*
you are going to have to make one yourself, using the C standard library directly.I didn't find a real answer to the problem, but I found out that if you don't need to convert the Python file object to a
FILE*
(i.e., you don't need to "share" the opened file), you can just usectypes
to callfopen
fromlibc
and get theFILE*
like that.