Hallo,
ich versuche einen Thread zu realisieren, der in einer Endlosschleife per exec() ein (annähernd) beliebiges Pythonscript ausführt:
...
while True:
exec(Script)
...
Soweit so gut, aber das Script soll nun aus dieser Schleife herausspringen können, als sich und die Schleife beenden:
....
if condition:
break
...
Das Problem ist nun, dass ich beim exec()-Aufruf einen Syntaxfehler erhalte:
"SyntaxError: 'break' outside loop (<string>, line 148)"
Ersetze ich break durch return erhalte ich eine ähnliche Fehlermeldung.
Hat jemand eine Idee, wie ich das realisieren kann?
Ciao
Matthias
exec(Script) vorzeitig beenden
Vielleicht die Kondition jedes mal bei der while-Schleife checken?
Und was soll der Satz bedeuten?
Code: Alles auswählen
while 1:
exec()
if kondition:
break
Soweit so gut, aber das Script soll nun aus dieser Schleife herausspringen können, als sich und die Schleife beenden:
Zum besseren Verständnis ein Ausschnitt des Ausführungsthreads:
mit: self._facet._runEvent = threading.Event()
Die Idee ist, dass ein Script, sofern entsprechende Bedingungen erfüllt sind self._facet._runEvent.set() aufruft und danach aus Loop2 rausspringt und somit nicht mehr ausgeführt wird.
Da Scripte beliebig komplex sein können, genügt es nicht, am Schleifenende mögliche Bedingungen zu überprüfen. Ein einfaches Beispiel wäre, wenn das Script selbst eine While-Schleife implementieren würde...
Edit by Gerold: BBCode in diesem Beitrag aktiviert
Code: Alles auswählen
class Thread(threading.Thread):
def init(self, facet):
self._facet = facet
def run(self):
while True: #Loop 1
while True: #Loop2
self._facet._runEvent.wait()
exec(self._facet._active)
break
#ensure that script doesn't (re)start on its own
self._facet._runEvent.clear()
Die Idee ist, dass ein Script, sofern entsprechende Bedingungen erfüllt sind self._facet._runEvent.set() aufruft und danach aus Loop2 rausspringt und somit nicht mehr ausgeführt wird.
Da Scripte beliebig komplex sein können, genügt es nicht, am Schleifenende mögliche Bedingungen zu überprüfen. Ein einfaches Beispiel wäre, wenn das Script selbst eine While-Schleife implementieren würde...
Edit by Gerold: BBCode in diesem Beitrag aktiviert
Zuletzt geändert von hiasl am Samstag 29. April 2006, 16:36, insgesamt 1-mal geändert.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Bitte editieren: Bodenstriche durch Leerzeichen ersetzen und in Code-Py-Tags setzen, dann klappt das auch mit dem Highlighting.hiasl hat geschrieben:class Thread(threading.Thread):
__def init(self, facet):
____self._facet = facet
__def run(self):
____while True: #Loop 1
______while True: #Loop2
________self._facet._runEvent.wait()
________exec(self._facet._active)
________break
______#ensure that script doesn't (re)start on its own
______self._facet._runEvent.clear()

Mir scheint, dass du dafür nicht exec() benutzen willst. Was willst du denn überhaupt (algemein) machen, was soll dein Programmm tun?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Das mit den Tags tut wohl nicht so ganz :(Leonidas hat geschrieben: Bitte editieren: Bodenstriche durch Leerzeichen ersetzen und in Code-Py-Tags setzen, dann klappt das auch mit dem Highlighting. :evil:
Mir scheint, dass du dafür nicht exec() benutzen willst. Was willst du denn überhaupt (algemein) machen, was soll dein Programmm tun?
Der Thread ist als Teil einer Maschinensteuerung gedacht, der ein Ablaufskript ausführen soll, dass beschreibt, was einzelne Maschinenkomponenten wann/wie tun, und dieses kontrolliert ausführt. Letzteres bedeutet, dass das Skript zu jedem beliebigen Zeitpunkt unterbrechbar sein muss.
Das Skript ist in "self._facet._active" hinterlegt, wobei das Ablaufskript jederzeit übers Netzwerk ausgetauscht werden kann.
Mir fällt kein anderer Ansatz ein, als exec() zu verwenden...
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hi hiasl!
Du musst in deinem Forenprofil "BBCode" erlauben, sonst wird das nichts mit den Code- oder mit den Quote-Tags.
mfg
Gerold

Du musst in deinem Forenprofil "BBCode" erlauben, sonst wird das nichts mit den Code- oder mit den Quote-Tags.
mfg
Gerold

http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hi Matthias!hiasl hat geschrieben:"SyntaxError: 'break' outside loop (<string>, line 148)"
Ersetze ich break durch return erhalte ich eine ähnliche Fehlermeldung.
Versuche mal "eval()" das hat nicht so viele Rechte (z.B. kann im externen Skript nichts importiert werden), verhält sich aber eher wie ein Teil des Hauptprogramms.
mfg
Gerold

http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.