9

以下代码适用于 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中的一个例外。

4

2 回答 2

13

我只需要一种将文件对象转换为 ctypes FILE* 的方法,以便可以将其传递给 GD。

你运气不好。这在 Python 2.x 中是可能的,但在 Python 3.x 中是不可能的。该文档解释了为什么不:

这些 API 是用于内置文件对象的 Python 2 C API 的最小模拟,它过去依赖于 C 标准库的缓冲 I/O (FILE*) 支持。在 Python 3 中,文件和流使用新的 io 模块,它在操作系统的低级无缓冲 I/O 上定义了几个层。

如果你想要一个FILE*,你将不得不自己制作一个,直接使用 C 标准库。

于 2013-04-21T14:39:07.587 回答
3

我没有找到问题的真正答案,但我发现如果您不需要将 Python 文件对象转换为 a FILE*(即,您不需要“共享”打开的文件),您可以只是ctypes用来打电话并得到类似的fopen东西。libcFILE*

于 2013-04-21T12:51:12.480 回答