Hi,

It seems like there is a small bug (or a missing detail) in the example code of the main function in Chapter "1.4. The Module’s Method Table and Initialization Function".

In the example, the return value of PyImport_ImportModule is discarded. In my experience, this may cause a crash in Py_Finalize() if the return value is discarded and Py_DECREF is omitted.

Is my assumption correct that the example should actually be extended as follows?

    ...

    /* Optionally import the module; alternatively,
       import can be deferred until the embedded script
       imports it. */
    PyObject *pModule = PyImport_ImportModule("spam");

    ...

    Py_DECREF(pModule);
    if (Py_FinalizeEx() < 0) {
        exit(120);
    }

    PyMem_RawFree(program);
    return 0;

Note that I assume that the developer is supposed to keep a reference of the module object, such that the garbage collection cannot free the module, while the program is using the interpreter. Is this necessary? Or can I be 100% sure that the imported module will exist and do it's job until I call Py_FinalizeEx(), even if I don't keep a reference of the module, i.e., if I decref pModule directly after importing it?

Regards,
Johannes

PS: In my case, the module is a Python output redirector, that's not explicitly used in the executed Python scripts and snippets. It is just supposed to redirect the output of the entire Python interpreter until I call Py_Finalize.