以下代码可以在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))但是在Python3中,pythonapi中没有PyFile_AsFile。
代码是来自testPixelOps.py的except。
发布于 2013-04-21 22:39:08
我只需要一种将文件对象转换成ctype文件的方法,这样我就可以把它传递给GD。
你真不走运。这在Python2.x中是可能的,但在Python3.x中是不可能的。documentation解释了为什么不:
这些API是针对内置文件对象的Python2CAPI的最小模拟,后者过去依赖于C标准库的缓冲I/O ( file *)支持。在Python3中,文件和流使用新的io模块,该模块在操作系统的低级无缓冲I/O上定义了多个层。
如果你想要一个FILE*,你必须自己做一个,直接使用C标准库。
发布于 2013-04-21 20:51:12
我没有找到这个问题的真正答案,但我发现如果不需要将Python file对象转换为FILE* (即,您不需要“共享”打开的文件),则只需使用ctypes从libc调用fopen并获得类似的FILE*即可。
https://stackoverflow.com/questions/16130268
复制相似问题