Вопрос по ffi, python-3.x, ctypes, python – Замена Python 3 для PyFile_AsFile

6

Следующий код работает в 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.

@DavidHeffernan: Мне просто нужен был способ конвертировать файловый объект в файл FILE * ctypes, чтобы я мог передать его в GD. То есть Я просто ищу Python 3 эквивалент выше. PyFile_AsFile действительно доступен с использованием Python 2, как демонстрирует этот фрагмент кода. Janus Troelsen
Похоже, тамрешениеВот, но это сегфолт для меня. Janus Troelsen
Ах, я знаю, почему это произошло. Я использовал дескриптор файла в качестве файла * ... Janus Troelsen
@jamylak: я нене могу найти ответ. Я только что узнал, что сделал что-то не так. Я нене думаю, что этона самом деле это решение больше, потому что они просто импортируют различные функции API в зависимости от версии, но они нена самом деле их использовать. Janus Troelsen

Ваш Ответ

2   ответа
9

* ctypes, чтобы я мог передать его в GD.

Вам не повезло. Это было возможно в Python 2.x, но невозможно в Python 3.x.документация объясняет почему нет:

Эти API-интерфейсы являются минимальной эмуляцией Python 2 C API для встроенных файловых объектов, которые использовались для поддержки буферизованного ввода-вывода (FILE *) из стандартной библиотеки C. В Python 3 файлы и потоки используют новый модуль io, который определяет несколько уровней над небуферизованным небуферизованным вводом-выводом операционной системы.

Если вы хотитеFILE* вам придется создать его самостоятельно, используя стандартную библиотеку C напрямую.

Спасибо, Дэвид, я был глуп, что не прочитал заголовок этой страницы документа. Janus Troelsen
2

не могу найти реального ответа на проблему, но я узнал, что если вы ненеобходимо преобразовать объект файла Python вFILE* (т.е. вы нене надо "доля" открытый файл), вы можете просто использоватьctypes звонитьfopen отlibc и получитьFILE* как это.

А такжеэтот ответ показывает как позвонитьfopen отlibc, Благодарю. Rafa

Похожие вопросы