Замена Python 3 для PyFile_AsFile

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

 David Heffernan21 апр. 2013 г., 16:40
Я, конечно, никогда не говорил, чтоPyFile_AsFile был недоступен Просто это было странно, чтобы использовать в первую очередь.
 Janus Troelsen21 апр. 2013 г., 16:33
@DavidHeffernan: Мне просто нужен был способ конвертировать файловый объект в файл FILE * ctypes, чтобы я мог передать его в GD. То есть Я просто ищу Python 3 эквивалент выше. PyFile_AsFile действительно доступен с использованием Python 2, как демонстрирует этот фрагмент кода.
 Janus Troelsen21 апр. 2013 г., 13:07
@jamylak: я нене могу найти ответ. Я только что узнал, что сделал что-то не так. Я нене думаю, что этона самом деле это решение больше, потому что они просто импортируют различные функции API в зависимости от версии, но они нена самом деле их использовать.
 Janus Troelsen21 апр. 2013 г., 12:46
Ах, я знаю, почему это произошло. Я использовал дескриптор файла в качестве файла * ...
 jamylak21 апр. 2013 г., 12:50
Отлично ответьте на свой вопрос и примите его, если, конечно, нет лучших ответов
 Janus Troelsen21 апр. 2013 г., 12:39
Похоже, тамрешениеВот, но это сегфолт для меня.
 David Heffernan21 апр. 2013 г., 16:15
Почему вы хотите позвонитьPyFile_AsFile используя ctypes? Вы используете ctypes для доступа к вещам, которые недоступны с помощью Python.
 MasterMind03 сент. 2014 г., 17:48
Проверьте этот ответ:stackoverflow.com/a/9629271/1046299

Ответы на вопрос(2)

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

 Rafa28 окт. 2015 г., 19:56
А такжеэтот ответ показывает как позвонитьfopen отlibc, Благодарю.
Решение Вопроса

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

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

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

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

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

Ваш ответ на вопрос