Search code examples
pythonpython-3.xpython-c-api

File I/O in the Python 3 C API


The C API in Python 3.0 has changed (deprecated) many of the functions for File Objects.

Before, in 2.X, you could use

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

to create a Python file object, e.g:

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

...but such function no longer exists in Python 3.0. What would be the Python 3.0 equivalent to such call?


Solution

  • You can do it the old(new?)-fashioned way, by just calling the io module.

    This code works, but it does no error checking. See the docs for explanation.

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