With the help of PyErr_Print() I have it solved. Here is the final code (the part relevant to sents):
Py_ssize_t listIndex = 0; pListItem = PyList_GetItem(pFileIds, listIndex); pListStrE = PyUnicode_AsEncodedString(pListItem, "UTF-8", "strict"); pListStr = PyBytes_AS_STRING(pListStrE); // Borrowed pointer // Then: sentences = gutenberg.sents(fileid) - this is a sequence item PyObject *c_args = Py_BuildValue("s", pListStr); PyObject *args_tuple = PyTuple_New(1); PyTuple_SetItem(args_tuple, 0, c_args); pSents = PyObject_CallObject(pSentMod, args_tuple); if ( pSents == 0x0){ PyErr_Print(); return return_value; } As you mentioned yesterday, CallObject needs a tuple, so that was the problem. Now it works. You also asked why I don't just use pListStrE. I tried that and got a long error message from PyErr_Print. I'm not far enough along in my C_API work to understand why, but it doesn't work. Thanks very much for your help on this. Jen Feb 9, 2022, 17:40 by songofaca...@gmail.com: > On Thu, Feb 10, 2022 at 10:37 AM Jen Kris <jenk...@tutanota.com> wrote: > >> >> I'm using Python 3.8 so I tried your second choice: >> >> pSents = PyObject_CallFunctionObjArgs(pSentMod, pListItem); >> >> but pSents is 0x0. pSentMod and pListItem are valid pointers. >> > > It means exception happened. > If you are writing Python/C function, return NULL (e.g. `if (pSents == > NULL) return NULL`) > Then Python show the exception and traceback for you. > > -- > Inada Naoki <songofaca...@gmail.com> > -- https://mail.python.org/mailman/listinfo/python-list