Python C-Api, PyImport_Import

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
alti23
User
Beiträge: 11
Registriert: Dienstag 29. März 2011, 12:56

Hallo zusammen,

ich möchte via Python C-Api aus meinem C++ Code heraus Pythonscripte ausführen. Diese werden so:

pModule = PyImport_Import(pName);

if(!pModule)
{
// schreibe Fehlermeldung hier
}

geladen.
Mir gelingt es jedoch nicht, aus der C-Api eine gescheite Fehlermeldung(also Art des Fehlers, Zeilennummer, ...) für den Fall herauszuholen, wenn das geladene Script Syntaxfehler, ... enthält.
Hat das schon mal jemand erfolgreich umgesetzt?
Vielen Dank.

Gruss Marko
__deets__
User
Beiträge: 12288
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du bekommst laut https://docs.python.org/3/c-api/exceptions.html ein traceback Objekt. Das kannst du dann ausgeben oder inspizieren.
alti23
User
Beiträge: 11
Registriert: Dienstag 29. März 2011, 12:56

Hallo,

vielen Dank für die Rückmeldung.
Das beschriebene TRacebackObj liefert sehr detaillierte Info's, falls während der Ausführung etwas schief geht, jedoch leider nicht beim PyImport_Import.

Gruss Marko
__deets__
User
Beiträge: 12288
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich sehe jetzt nicht, was an einem import anders sein soll. Ein ImportError wird ausgelöst, und ein traceback dazu. Was fehlt dir denn da?
alti23
User
Beiträge: 11
Registriert: Dienstag 29. März 2011, 12:56

def testfu()
pass

Bei dem hier fehlenden ':' liefert traceback.format_exc() lediglich: "NoneType: None".
__deets__
User
Beiträge: 12288
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du zeigst nicht, wie du das aufrufst. Darum kann man nur raten. Aber in der zitierten Dokumentation ist der Unterschied zwischen einer ‘im flug’ befindlichen und einer gefangenen exception beschrieben. Das denke ich könnte hier die Ursache sein.
alti23
User
Beiträge: 11
Registriert: Dienstag 29. März 2011, 12:56

Ich mache folgendes:

pModule = PyImport_Import(pName);

if(!pModule)
{
printf traceback.format_exc()
}

pName enthält das Script mit dem oben beschriebenen Fehler und traceback.format_exc() liefert den oben beschriebenen nichts-sagenden Text zurück.
Welche Stelle in dem Dokument genau meinst Du?
Vielen Dank für Deine Hilfe.

Gruss
__deets__
User
Beiträge: 12288
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist nicht was du machst. Denn das ist pseudo Code.

Und in dem Link steht extra hervorgehoben

Note The error indicator is not the result of sys.exc_info(). The former corresponds to an exception that is not yet caught (and is therefore still propagating), while the latter returns an exception after it is caught (and has therefore stopped propagating).

Und in der Sektion https://docs.python.org/3/c-api/excepti ... -indicator steht, wie man an den error kommt.
Antworten