boost + python + PyErr_Print umleiten
-
Hey @all,
weiß jemand ob es mit boost python irgendwie möglich ist die Ausgabe von "PyErr_Print()" auf der Konsole zu unterdrücken, und stattdessen einen std::string oder ähnliches zurück zu bekommen?
Folgender Tipp: http://www.c-plusplus.net/forum/viewtopic-var-p-is-1495461.html
.filmor schrieb:
catch (bp::error_already_set const&) { bp::str blubb = bp::import("sys").attr("stderr").attr("data"); // mit blubb rumspielen, zB zu std::string konvertieren oder sowas }funktioniert leider nicht, da bekomme ich folgenden Fehler:
error: conversion from `boost::python::api::proxy<boost::python::api::attribute_policies>' to non-scalar type `boost::python::str' requestedDas ganze wäre deswegen weil ich das ganze für eine MessageBox brauchen würde (GUI Applikation), somit brauche ich eben keine Ausgabe auf eine Konsole:
try { . . . }catch(PythonFehler &e) { // PyErr_Print(); // <------ Die Ausgabe soll stattdessen in die MessageBox MessageBox("HIER KOMMT DER PYTHON FEHLER (BACKTRACE) REIN"); }Habe bei mir folgendes laufen:
- Python 2.5.2
- Boost 1_35_0
- mingw32-make 3.80
Vielen lieben Dank im Voraus
Lg _freeze_
-
Du hast meinen Tipp aber ganz schön aus dem Kontext gerissen
(ändert nichts an dem Fehler, da müsste wohl noch ein as_string oder sowas hin, müsstest du in der Doku nachsehen).Wie wärs hiermit?
class StderrCatcher { public: StderrCatcher (std::string& ref) : _data (ref) { bp::object new_stream; new_stream.attr ("write") = bp::def (StderrCatcher::write); bp::object sys = bp::import ("sys"); _old_stream = sys.attr ("stderr"); sys.attr ("stderr") = new_stream; } ~StderrCatcher () { bp::import ("sys").attr ("stderr") = _old_stream; } void write (std::string const& str) { _data += str; } private: std::string& _data; bp::object _old_stream; }; /// Benutzen dann: catch (bla) { std::string err_msg; { StderrCatcher catcher (err_msg); PyErr_Print (); } // err_msg verwenden }
-
Danke vielmals,
werde ich dann gleich mal probieren.
.filmor schrieb:
Du hast meinen Tipp aber ganz schön aus dem Kontext gerissen
Wie meinst Du das? Habe ich was falsch verstanden?
Lg
-
freeze schrieb:
Danke vielmals,
werde ich dann gleich mal probieren.
Sag mir dann auch, ob's funzt. Sowas kann man bestimmt nochmal gebrauchen. Bin aber ganz zuversichtlich

freeze schrieb:
.filmor schrieb:
Du hast meinen Tipp aber ganz schön aus dem Kontext gerissen
Wie meinst Du das? Habe ich was falsch verstanden?
Naja, das funktioniert so alles nur, wenn du den StdoutCatcher aus dem Link, den ich dir gegeben habe benutzt. Die Verbindung wahr vielleicht unklar.
Verstehst du den Code?