Die print Funktion habe ich in C++
Nun versuche ich nur noch mit einem C++ Befehl das print zu ersetzen. Wie mache ich das?
Edit: Habe es nun mit PyRun_SimpleString und darin den Python Code geschrieben gelöst. Ist das clever?
Eine andere Frage habe ich auch noch. Kann man beim Compilieren eines C++ ein Pyton Script importieren, das beim Ausführen immer importiert wird und nicht veränderbar ist?
C++ und Python
Wenn ich ein Python Script das im Ordner liegt einlesen lasse, dann ist das veränderbar.
Also ein Script das nicht zur Laufzeit von Python eingelesen wird, sondern beim Compilieren schon eingelesen wurde und somit fest im Programm steht.
Kann man den TraceBack in ein String umwandeln?
Also ein Script das nicht zur Laufzeit von Python eingelesen wird, sondern beim Compilieren schon eingelesen wurde und somit fest im Programm steht.
Kann man den TraceBack in ein String umwandeln?
@Centurius: Fest im Programm stehen schützt nicht davor das sich da jemand mit einem Hexeditor drüber her macht. Mit relativ kleinen Änderungen könnte man da beliebig viel Python-Code ausführen, denn man muss ja nur etwas eigenes von dort importieren lassen, das dann ausserhalb der EXE abgelegt ist.
Ja, man kann Tracebacks in Zeichenketten umwandeln: `traceback`-Modul in der Standardbibliothek.
Ja, man kann Tracebacks in Zeichenketten umwandeln: `traceback`-Modul in der Standardbibliothek.
Ich hab folgendes probiert:
Ich weiß nicht wie ich traceback in einen String oder Char* bekomme
Code: Alles auswählen
PyObject *type = NULL, *value = NULL, *traceback = NULL, *pyString = NULL;
PyErr_Fetch(&type, &value, &traceback);
PyErr_Clear();
std::string message;
if (traceback != NULL && PyTraceBack_Check(traceback)) {
message = PyUnicode_AsUFT8(traceback);
}
Zuletzt geändert von Anonymous am Mittwoch 15. März 2017, 20:30, insgesamt 2-mal geändert.
Grund: Quelltext in Codebox-Tags gesetzt.
Grund: Quelltext in Codebox-Tags gesetzt.
@Centurius: Na dann musst Du mit der C-API das `traceback`-Modul importieren und beispielsweise die `format_exc()`-Funktion aufrufen. Du willst bestimmt nicht all das was es da schon in Python gibt, mühsam in C++ nachprogrammieren. Das importieren und verwenden wäre mit persönlich über die C-API ja schon ein bisschen zu nervig. Ich würde so viel wie möglich versuchen in Python-Code zu verschieben.
Casten geht natürlich nicht, aber Du kannst den Wahrheitswert eines Python-Objekts mit PyObject_IsTrue() ermitteln.
Heute ist noch ein Problem entstanden.
Und zwar habe ich in mein Python Script, das mit PyImport_Import geladen wird, einen Thread. Doch dieser Thread wird nur so lange ausgeführt, wie etwas in dem Python Script außerhalb des Thread durch geführt wird.
Kann man das so programmieren, dass der Thread weiter ausgeführt wird?
Und zwar habe ich in mein Python Script, das mit PyImport_Import geladen wird, einen Thread. Doch dieser Thread wird nur so lange ausgeführt, wie etwas in dem Python Script außerhalb des Thread durch geführt wird.
Kann man das so programmieren, dass der Thread weiter ausgeführt wird?
@Centurius: Damit Python-Code in CPython läuft, muss halt der Python-Interpreter laufen. Das tut der nicht von alleine.
@Centurius: Damit die Threads laufen muss der Python-Interpreter laufen. Also dort der Hauptthread der den Bytecodeinterpreter am laufen hält und beispielsweise dafür sorgt das alle x Bytecodes der Thread gewechselt werden kann, die Speicherbereinigung ausgeführt wird, und der eventuelle Signale verarbeitet.
@Centurius: dazu müßte man wissen, wie Du die Einbindung von Python in Dein C++-Programm gestalten willst. Wenn Du multithreaded arbeitest, mußt Du aufpassen, dass immer, wenn Du etwas im Python-Bereich ändern willst, das GIL anfordern mußt und entsprechend auch wieder freigeben, wenn Du fertig bist.
Es ist so das ich eine DLL erstelle. Diese DLL lädt mehrere Python Module um als eine Schnittstelle zwischen einem Programm und mehreren Python Modulen zu fungieren.
Bedeutetet das Programm ruft nach dem Laden der Python Module immer mal auf deren Funktionen zu. Das läuft alles bisher ohne Threads, was bedeutet, wenn man eine while true Schleife einbaut, wäre das Programm in der Python Funktion gefangen und benutze ich Threads wird der gesleept sobald die Funktion in dem Python Module durch ist.
Wie gehe ich nun am besten vor um das Problem zu lösen?
Bedeutetet das Programm ruft nach dem Laden der Python Module immer mal auf deren Funktionen zu. Das läuft alles bisher ohne Threads, was bedeutet, wenn man eine while true Schleife einbaut, wäre das Programm in der Python Funktion gefangen und benutze ich Threads wird der gesleept sobald die Funktion in dem Python Module durch ist.
Wie gehe ich nun am besten vor um das Problem zu lösen?
Keine while-schleife erstellen? Kooperativer Code waere denke ich die zu bevorzugende Loesung.
Ansonsten koenntest du versuchen, aus c++ in einem Timer immer wieder einen Callback in Python aufzurufen, der letztlich nix tut, aber eben Interpreter-Hausarbeit (implizit) verrichtet. So zumindest verstehe ich das Problem.
Ansonsten koenntest du versuchen, aus c++ in einem Timer immer wieder einen Callback in Python aufzurufen, der letztlich nix tut, aber eben Interpreter-Hausarbeit (implizit) verrichtet. So zumindest verstehe ich das Problem.