Файловый ввод / вывод в Python 3 C API - PullRequest
7 голосов
/ 22 мая 2009

C API в Python 3.0 изменил (устарел) многие функции для файловых объектов.

Раньше, в 2.X, вы могли использовать

PyObject* PyFile_FromString(char *filename, char *mode)

для создания объекта файла Python, например:

PyObject *myFile = PyFile_FromString("test.txt", "r");

... но такая функция больше не существует в Python 3.0. Что бы Python 3.0 эквивалентно такому вызову?

Ответы [ 2 ]

6 голосов
/ 23 мая 2009

Вы можете сделать это старым (новым?) Способом, просто вызвав модуль io.

Этот код работает, но не проверяет ошибки. См. Документы для объяснения.

PyObject *ioMod, *openedFile;

PyGILState_STATE gilState = PyGILState_Ensure();

ioMod = PyImport_ImportModule("io");

openedFile = PyObject_CallMethod(ioMod, "open", "ss", "foo.txt", "wb");
Py_DECREF(ioMod);

PyObject_CallMethod(openedFile, "write", "y", "Written from Python C API!\n");
PyObject_CallMethod(openedFile, "flush", NULL);
PyObject_CallMethod(openedFile, "close", NULL);
Py_DECREF(openedFile);

PyGILState_Release(gilState);
Py_Finalize();
4 голосов
/ 22 мая 2009

Эта страница утверждает, что API:

PyFile_FromFd(int fd, char *name, char *mode, int buffering, char *encoding, char *newline, int closefd);

Не уверен, означает ли это, что Python не может открыть файл из имени файла, но это должно быть тривиально, если вы делаете это самостоятельно, в C.

...