【问题标题】:Python 3 replacement for PyFile_AsFilePyFile_AsFile 的 Python 3 替代品
【发布时间】:2013-04-14 08:39:35
【问题描述】:

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

【问题讨论】:

  • 看起来有解决方案here,但它对我来说是段错误。
  • 啊,我知道它为什么会出现段错误。我将文件描述符用作 FILE*...
  • 完全可以回答你自己的问题并接受它,当然如果没有其他更好的答案
  • @jamylak:我没有找到答案。我才发现我做错了什么。我不认为它实际上是一个解决方案,因为它们只是根据版本导入不同的 API 函数,但实际上并没有使用它们。
  • 为什么要使用 ctypes 调用PyFile_AsFile?您可以使用 ctypes 来获取使用 Python 无法获得的东西。

标签: python python-3.x ctypes ffi


【解决方案1】:

我没有找到问题的真正答案,但我发现如果您不需要将 Python 文件对象转换为 FILE*(即,您不需要“共享”打开的文件),您可以使用ctypeslibc 调用fopen 并获得FILE* 这样。

【讨论】:

  • this answer 展示了如何从libc 调用fopen。谢谢。
【解决方案2】:

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

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

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

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

【讨论】:

  • 谢谢大卫,我愚蠢的没有阅读那个文档页面的标题。
猜你喜欢
  • 2012-02-18
  • 1970-01-01
  • 1970-01-01
  • 2013-03-28
  • 2020-12-25
  • 1970-01-01
  • 2021-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多