C++ und Python

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Centurius
User
Beiträge: 22
Registriert: Dienstag 14. März 2017, 14:09

Mittwoch 15. März 2017, 17:44

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?
Sirius3
User
Beiträge: 7608
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 15. März 2017, 18:25

@Centurius: Es gibt auch das C-Funktionsäquivalent zu "setattr", nichts anderes ist ja das Setzen eines Wertes in einem Modul. Was Du mit "nicht veränderbar" meinst, verstehe ich nicht.
Centurius
User
Beiträge: 22
Registriert: Dienstag 14. März 2017, 14:09

Mittwoch 15. März 2017, 18:36

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?
BlackJack

Mittwoch 15. März 2017, 18:41

@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.
Centurius
User
Beiträge: 22
Registriert: Dienstag 14. März 2017, 14:09

Mittwoch 15. März 2017, 18:59

Ich hab folgendes probiert:

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);
}
Ich weiß nicht wie ich traceback in einen String oder Char* bekomme
Zuletzt geändert von Anonymous am Mittwoch 15. März 2017, 20:30, insgesamt 2-mal geändert.
Grund: Quelltext in Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 7608
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 15. März 2017, 19:40

@Centurius: hast Du Dir das Modul traceback schonmal angeschaut?
Centurius
User
Beiträge: 22
Registriert: Dienstag 14. März 2017, 14:09

Mittwoch 15. März 2017, 20:07

Ne, aber ich wollte die Fehlermeldung in C++ behandeln
BlackJack

Mittwoch 15. März 2017, 20:35

@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. :-)
Centurius
User
Beiträge: 22
Registriert: Dienstag 14. März 2017, 14:09

Mittwoch 15. März 2017, 21:28

Ach so. Okay, das probiere ich mal aus. Danke

Als letztes würde ich noch wissen wie ich ein PyObject das ein Boolean ist in einen C boolean caste.
BlackJack

Mittwoch 15. März 2017, 21:40

Casten geht natürlich nicht, aber Du kannst den Wahrheitswert eines Python-Objekts mit PyObject_IsTrue() ermitteln.
Centurius
User
Beiträge: 22
Registriert: Dienstag 14. März 2017, 14:09

Mittwoch 15. März 2017, 21:49

Vielen Dank für die Hilfe bei meinen ganzen Fragen!!!
Das ist ein super Forum! Sehr Hilfsbereit!

Ich hoffe ich habe nicht zu viele doofe Fragen gestellt :wink:
Centurius
User
Beiträge: 22
Registriert: Dienstag 14. März 2017, 14:09

Samstag 18. März 2017, 20:17

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?
BlackJack

Samstag 18. März 2017, 22:08

@Centurius: Damit Python-Code in CPython läuft, muss halt der Python-Interpreter laufen. Das tut der nicht von alleine.
Centurius
User
Beiträge: 22
Registriert: Dienstag 14. März 2017, 14:09

Samstag 18. März 2017, 22:42

Meinst du Py_Initialize? Verstehe nicht so richtig was du mir sagen möchtest.

Also an sich läuft alles. Nur die Threads in Python stoppen
BlackJack

Sonntag 19. März 2017, 00:13

@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.
Antworten