Python C API: how to get string representation of exception?

exception, python, python-c-api

Solution

I think that Python exceptions are printed by running "str()" on the exception instance, which will return the formatted string you're interested in. You can get this from C by calling the `PyObject_Str()` method described here:

https://docs.python.org/c-api/object.html

Good luck!

Update: I'm a bit confused why the second element being returned to you by `PyErr_Fetch()` is a string. My guess is that you are receiving an "unnormalized exception" and need to call `PyErr_NormalizeException()` to turn that tuple into a "real" Exception that can format itself as a string like you want it to.

Problem

If I do (e.g.) ``` open("/snafu/fnord") ``` in Python (and the file does not exist), I get a traceback and the message ``` IOError: [Errno 2] No such file or directory: '/snafu/fnord' ``` I would like to get the above string with Python's C API (i.e., a Python interpreter embedded in a C program). I need it as a string, not output to the console. With `PyErr_Fetch()` I can get the type object of the exception and the value. For the above example, the value is a tuple: ``` (2, 'No such file or directory', '/snafu/fnord') ``` Is there an easy way from the information I get from `PyErr_Fetch()` to the string the Python interpreter shows? (One that does not involve to construct such strings for each exception type yourself.)

Original source