Python C API: ¿cómo obtener una representación de cadena de excepción?
-
05-07-2019 - |
Pregunta
Si lo hago (por ejemplo)
open("/snafu/fnord")
en Python (y el archivo no existe), recibo un rastreo y el mensaje
IOError: [Errno 2] No such file or directory: '/snafu/fnord'
Me gustaría obtener la cadena anterior con la API C de Python (es decir, un intérprete de Python integrado en un programa C). Lo necesito como una cadena, no como salida a la consola.
Con PyErr_Fetch ()
puedo obtener el tipo de objeto de la excepción y el valor. Para el ejemplo anterior, el valor es una tupla:
(2, 'No such file or directory', '/snafu/fnord')
¿Hay una manera fácil de obtener la información que recibo de PyErr_Fetch ()
a la cadena que muestra el intérprete de Python? (Una que no implique construir esas cadenas para cada tipo de excepción).
Solución
Creo que las excepciones de Python se imprimen ejecutando " str () " en la instancia de excepción, que devolverá la cadena formateada que le interesa. Puede obtener esto de C llamando a PyObject_Str ()
método descrito aquí:
https://docs.python.org/c-api/object.html
¡Buena suerte!
Actualización: Estoy un poco confundido por qué el PyErr_Fetch ()
te devuelve el segundo elemento. Supongo que está recibiendo una " excepción no normalizada " y debes llamar a PyErr_NormalizeException ()
para convertir esa tupla en " real " Excepción que puede formatearse a sí misma como una cadena como usted quiere.