E / S de archivos en la API de Python 3 C

La API de C en Python 3.0 ha cambiado (en desuso) muchas de las funciones para objetos de archivo.

Antes, en 2.X, podías usar

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

para crear un objeto de archivo Python, por ejemplo:

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

… pero dicha función ya no existe en Python 3.0. ¿Cuál sería el equivalente de Python 3.0 a dicha llamada?

Puede hacerlo de la forma antigua (¿nueva?), Simplemente llamando al módulo io.

Este código funciona, pero no realiza ninguna comprobación de errores. Consulte la documentación para obtener una explicación.

 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(); 

Esta página afirma que la API es:

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

No estoy seguro de si eso significa que no es posible hacer que Python abra el archivo desde el nombre de archivo, pero eso debería ser trivial, en C.