Seite 1 von 1

exec(Script) vorzeitig beenden

Verfasst: Samstag 29. April 2006, 12:17
von hiasl
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

Verfasst: Samstag 29. April 2006, 13:08
von murph
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:

Verfasst: Samstag 29. April 2006, 14:18
von hiasl
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

Verfasst: Samstag 29. April 2006, 15:46
von Leonidas
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?

Verfasst: Samstag 29. April 2006, 16:50
von hiasl
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...

Verfasst: Samstag 29. April 2006, 17:24
von gerold
Hi hiasl!

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

mfg
Gerold
:-)

Re: exec(Script) vorzeitig beenden

Verfasst: Samstag 29. April 2006, 17:31
von gerold
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
:-)