exec(Script) vorzeitig beenden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
hiasl
User
Beiträge: 31
Registriert: Donnerstag 20. April 2006, 13:36

Samstag 29. April 2006, 12:17

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
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Samstag 29. April 2006, 13:08

Vielleicht die Kondition jedes mal bei der while-Schleife checken?

Code: Alles auswählen

while 1:
    exec()
    if kondition:
        break

Und was soll der Satz bedeuten?
Soweit so gut, aber das Script soll nun aus dieser Schleife herausspringen können, als sich und die Schleife beenden:
hiasl
User
Beiträge: 31
Registriert: Donnerstag 20. April 2006, 13:36

Samstag 29. April 2006, 14:18

Zum besseren Verständnis ein Ausschnitt des Ausführungsthreads:

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()
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
Zuletzt geändert von hiasl am Samstag 29. April 2006, 16:36, insgesamt 1-mal geändert.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 29. April 2006, 15:46

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()
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?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
hiasl
User
Beiträge: 31
Registriert: Donnerstag 20. April 2006, 13:36

Samstag 29. April 2006, 16:50

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?
Das mit den Tags tut wohl nicht so ganz :(

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...
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Samstag 29. April 2006, 17:24

Hi hiasl!

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.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Samstag 29. April 2006, 17:31

hiasl hat geschrieben:"SyntaxError: 'break' outside loop (<string>, line 148)"
Ersetze ich break durch return erhalte ich eine ähnliche Fehlermeldung.
Hi Matthias!

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