Python C API: comment obtenir une représentation sous forme de chaîne d'exception?
-
05-07-2019 - |
Question
Si je le fais (par exemple)
open("/snafu/fnord")
en Python (et le fichier n'existe pas), je reçois une trace et le message
IOError: [Errno 2] No such file or directory: '/snafu/fnord'
Je voudrais obtenir la chaîne ci-dessus avec l'API C de Python (c'est-à-dire un interpréteur Python intégré dans un programme C). J'en ai besoin en tant que chaîne, pas en sortie sur la console.
Avec PyErr_Fetch ()
, je peux obtenir le type d'objet de l'exception et la valeur. Pour l'exemple ci-dessus, la valeur est un tuple:
(2, 'No such file or directory', '/snafu/fnord')
Existe-t-il un moyen simple de passer des informations obtenues de PyErr_Fetch ()
à la chaîne affichée par l'interpréteur Python? (C’est-à-dire qu’il n’est pas nécessaire de construire vous-même de telles chaînes pour chaque type d’exception.)
La solution
Je pense que les exceptions Python sont imprimées en exécutant & str; str () " sur l’exception qui renverra la chaîne formatée qui vous intéresse. Vous pouvez l’obtenir de C en appelant le PyObject_Str ()
décrite ici:
https://docs.python.org/c-api/object.html
Bonne chance!
Mise à jour: Je ne comprends pas très bien pourquoi le deuxième élément qui vous est renvoyé par PyErr_Fetch ()
est une chaîne. Je suppose que vous recevez une "exception non normalisée". et devez appeler PyErr_NormalizeException ()
pour transformer ce tuple en un "réel". Une exception qui peut se formater comme une chaîne comme vous le souhaitez.