Файловый ввод-вывод в API Python 3 C
-
23-08-2019 - |
Вопрос
API C в 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?
Решение
Вы можете сделать это старым (новым?) способом, просто вызвав модуль 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();
Другие советы
Эта страница утверждает, что API:
PyFile_FromFd(int fd, char *name, char *mode, int buffering, char *encoding, char *newline, int closefd);
Не уверен, означает ли это, что Python невозможно открыть файл по имени файла, но это должно быть несложно сделать самостоятельно на C.
Не связан с StackOverflow