Python Embedding Thread safe?
Verfasst: Samstag 19. Juli 2008, 13:18
Hallo,
ich habe ein kleines Problem mit meiner eingebetteten Python Anbindung. Ich habe so gut wie fast alles gewrappt und stelle alles in Python zur Verfügung.
Mein Ziel: Ich möchte es möglich machen, mehrere Skripte gleichzeitig laufen zu lassen.
Mein Problem: Python ist ja nicht Thread-safe?
Was habe ich bisher gemacht. Ich klicke in meinem Programm auf einen Eintrag und öffne damit das entsprechende Python Skript. Jetzt wird ein neuer Thread geöffnet und darin der komplette Python Teil ausgeführt, heißt:
Wenn ich jetzt ein anderes Skript öffne verbschiedet sich das ganze Programm. Das Skript hier zum Beispiel möchte ich starten.
Das Problem ist, dass er beim öffnen der GUI (also bei fn.open(True) das Objekt erzeugt und sofort das Skript beendet weil danach ja nichts mehr kommt und deallokiert danach sofort wieder alles. Gibts eine Möglichkeit wie bei wxPython eine art mainloop einzubauen? Wie funktioniert dieser?
Gibts eine Möglichkeit Python einfach Thread-safe zu machen?
Danke schön!
ich habe ein kleines Problem mit meiner eingebetteten Python Anbindung. Ich habe so gut wie fast alles gewrappt und stelle alles in Python zur Verfügung.
Mein Ziel: Ich möchte es möglich machen, mehrere Skripte gleichzeitig laufen zu lassen.
Mein Problem: Python ist ja nicht Thread-safe?
Was habe ich bisher gemacht. Ich klicke in meinem Programm auf einen Eintrag und öffne damit das entsprechende Python Skript. Jetzt wird ein neuer Thread geöffnet und darin der komplette Python Teil ausgeführt, heißt:
Code: Alles auswählen
PyObject *f_globals, *f_locals, *mod, *rv;
mod = PyImport_ImportModule("__main__");
if (!mod)
return;
f_globals = PyModule_GetDict(mod);
f_locals = PyDict_New();
PyDict_Update(f_locals, f_globals);
if (!f_locals) {
Py_DECREF(mod);
PyErr_Print();
return;
}
rv = PyRun_String(<der python code>, Py_file_input, f_locals, f_locals);
GePrint("ZUENDE");
if (!rv)
PyErr_Print();
Py_XDECREF(rv);
Py_DECREF(mod);
Py_DECREF(f_locals);
Code: Alles auswählen
from test import *
class test(yourGUI):
MYBUTTON = 0
def create_gui(self):
self.set_title("Dialog I")
MYBUTTON = self.add_button("Ich habe einen Namen",150,15,self.button_click)
return True
def button_click(self):
println("ich bin der button")
if __name__ == "__main__":
fn = test()
fn.open(True)
Das Problem ist, dass er beim öffnen der GUI (also bei fn.open(True) das Objekt erzeugt und sofort das Skript beendet weil danach ja nichts mehr kommt und deallokiert danach sofort wieder alles. Gibts eine Möglichkeit wie bei wxPython eine art mainloop einzubauen? Wie funktioniert dieser?
Gibts eine Möglichkeit Python einfach Thread-safe zu machen?
Danke schön!