Python Code-Abarbeitung unterbrechen

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
TheBeginner
User
Beiträge: 8
Registriert: Sonntag 29. Mai 2011, 17:56

Hallo zusammen,

ich bin ein Neuling hier im Forum. Mit Python habe ich allerdings schon erste Erfahrungen gemacht. Jetzt bin ich auf eine Problem gestoßen, welches ich einfach nicht lösen kann. Habe bereits mehrere Tage versenkt ohne weiterzukommen. Nachfolgend beschreibe ich einfach mal mein Problem:
Ich möchte zwei Schleifen entwerfen. Eine erste "große" Schleife und eine zweite "kleine" Schleife. Nachdem die kleine Schleife durchlaufen wurde, soll die Skriptabarbeitung unterbrochen werden. Das Python-Skript soll in einem FE-Programm geöffnet und dann damit verschiedene Files eingelesen und abgearbeitet werden. Und genau da liegt der Hund begraben. Wenn ich die Abarbeitung des Skripts nach 5 Durchläufen der kleinen Schleife mit time.sleep anhalte, wird auch das FE-Programm angehalten. Das möchte ich aber nicht. Daher habe ich versucht es mal mit Timer zu probieren. Das Programm sieht nun so aus (vorerst nur die kleine Schleife drinnen, weil ich es auch so schon schwierig genug finde):

Code: Alles auswählen

import time
from threading import Timer

def nummer(i):
    print (i)

def fuenfblock():
    for i in range(1,6,1):
        print("Das ist Durchlauf Nummer",i)
        t = Timer(2,print(i))
        t.start()
Irgendwie schaffe ich es aber nicht, dass er print mittels des Timers startet. Was mache ich falsch? Ich komme einfach nicht drauf. Ist es möglich, dass während der Timer läuft das FE-Programm ausgeführt wird und nicht wie bei time.sleep angehalten wird?
Ich hoffe ihr könnt mir helfen. Vielen Dank schon einmal für alle Antworten auf diesen Post.

Gruß
TheBeginner
Zuletzt geändert von Anonymous am Sonntag 29. Mai 2011, 18:44, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@TheBeginner: Was ist ein FE-Programm!? Und irgendwie habe ich nicht verstanden welches Problem Du *eigentlich* lösen willst. Beschreib das Problem selbst doch mal mit Code, statt vermeintliche (Teil)Lösungen.

In dem Beispiel ist das zweite Argument von `Timer` falsch. Du rufst da ``print(i)`` auf und übergibst das *Ergebnis* von dem Aufruf. Da musst Du aber etwas *aufrufbares* übergeben, was dann vom `Timer` in dem angegebenen Intervall aufgerufen wird. Mit den Argumenten, die man bei `Timer` noch zusätzlich angeben kann.

Bei Threads und GUIs muss man immer im Auge behalten, dass die GUI nur von dem Thread manipuliert werden darf, in dem die Hauptschleife der GUI läuft. Bei Tkinter würde man zeitverzögerte Aufrufe eher mit der `after()`-Methode auf Steuerelementen machen.
TheBeginner
User
Beiträge: 8
Registriert: Sonntag 29. Mai 2011, 17:56

Hallo BlackJack,

danke für die schnelle Antwort. Bei einem FE-Programm handelt es sich um ein Programm zur Berechnung von Beanspruchung von Bauteilen und bedeutet Finite-Elemente.
Ich möchte das Problem lösen, dass bei einem Aufruf von time.sleep in Python auch die GUI des FE-Programms angehalten wird.
Das Programm sollte in etwas so aussehen:

Code: Alles auswählen

For j in range (1,150,1):
      For i in range (1,5,1):
            x=(j-1)*5+i
            py_send("*exec_proc_file d:\datei_,x,.proc")
            time.sleep(180)
Ich hoffe, daraus wird klar, was ich machen möchte. Wie ich jedoch vorher schon beschrieben habe, führt time.sleep jedoch dazu, dass auch die GUI des FE-Programms angehalten wird, was nicht passieren darf. Daher hatte ich gedacht, ich probiere es mal mit Timer. Welche Vorgehensweise würdest du vorschlagen?

Gruß
TheBeginner

Kurze Zusatzinfo: Dieser Python-Code wird aus dem FE-Programm heraus gestartet.
BlackJack

@TheBeginner: Ich habe immer noch nicht verstanden was überhaupt das Problem ist welches gelöst werden soll.
problembär

Ich auch nicht. Und zwar genau das:
TheBeginner hat geschrieben:Das Python-Skript soll in einem FE-Programm geöffnet und dann damit verschiedene Files eingelesen und abgearbeitet werden.
Ist das FE-Programm auch ein Python-Programm und das Skript ein Teil davon? Oder kommunzieren das FE-Programm (z.B. in C/C++) und das externe Python-Skript miteinander?
TheBeginner
User
Beiträge: 8
Registriert: Sonntag 29. Mai 2011, 17:56

Hallo zusammen,

das FE-Programm hat einen eingebauten Python-Interpreter und eine Python Oberfläche. Über diesen läuft das Ganze Python-Programm. Zusätzlich ist auf dem Rechner Python (IDLE 3.2) installiert, um einen größeren Befehlsumfang zur Verfügung zu haben. Es soll folgendes Problem gelöst werden:
Wenn ich in Python time.sleep aufrufe, dann schläft auch die Python-Oberfläche des FE-Programms. Das führt zu Problemen in der Abarbeitung der Procedure-Files durch das FE-Programm. Mit den Procedure-Files teile ich dem FE-Programm mit, was es machen soll per Stapelverarbeitung. Mit der kleinen Schleife sollen insgesamt jeweils 5 Modell erstellt und die Berechnung gestartet werden. Nach der Erstellung und dem Beginn des Rechenvorgangs soll eine definierte Zeit gewartet werden, bis wieder 5 Stück gestartet werden. Dann wieder 5 Stück etc. Ich muss dies so unterteilen, weil ich nicht beliebig viele Simulationen auf einmal starten kann. Die Anzahl an durchzuführenden Simulationen ist so groß, dass ich es nicht manuell machen kann, weil das viel zu lange dauern würde. Daher habe ich mir einfach gedacht, ich schreibe zwei kleine Schleifen.
Ich hoffe es ist nun etwas klarer geworden.

Gruß
TheBeginner
BlackJack

@TheBeginner: Das wird so nicht funktionieren wie Du Dir das vorstellst. Wenn das FE-Programm Dein Python-Skript startet, dann gibt es ja die Kontrolle an das Python-Programm ab und bekommt die anscheinend erst wieder wenn es abgelaufen ist. Zwischendurch die Kontrolle für eine gewisse Zeit zurück geben geht nur wenn es dafür einen API-Aufruf beim FE-Programm gibt.
TheBeginner
User
Beiträge: 8
Registriert: Sonntag 29. Mai 2011, 17:56

Hallo BlackJack,

danke für deine Hilfe.
Das ist sch****. Wie kann ich rausfinden, ob es einen API-Aufruf geben kann?
problembär

Frag' den Entwickler des FE-Programms.
TheBeginner
User
Beiträge: 8
Registriert: Sonntag 29. Mai 2011, 17:56

Hallo BlackJack,

mit API-Aufruf sieht es nicht so gut aus. Der Entwickler des FE-Programms wird aber nochmal nachschauen.
Wie sieht es denn aus, wenn ich verschiedene Threads aufrufe. Sind diese unabhängig voneinander, so dass ich nach Abarbeitung der Schleife beispielsweise einen Thread, welcher time.sleep enthält aufrufen kann, aber die anderen Threads weiterlaufen? Kennst du dich hier aus? Ich möchte ungern wieder eine Woche darin versenken und dann feststellen, dass es nicht geht.

Gruß
TheBeginner
BlackJack

@TheBeginner: Ich sehe nicht das Threads hier weiterhelfen könnten. Damit kannst Du mehrere Threads starten die Python-Code ausführen — deshalb wartet das FE-Programm trotzdem darauf bis der Python-Code fertig ist. Und der ist erst fertig wenn alle Threads am Ende sind.
TheBeginner
User
Beiträge: 8
Registriert: Sonntag 29. Mai 2011, 17:56

Hallo BlackJack,

schön langsam gehen mir irgendwie die Ansätze aus, wie dieses Problem in den Griff zu kriegen wäre. Meinst du man könnte es mit einer Queue lösen? Oder ist es sinnvoller mittels boost python aus C++ heraus zu starten? Ich hatte am Anfang gedacht, das Problem kann nicht so schwer sein, aber es stellt sich doch als harte Nuss heraus.
Hast du noch ein paar Ideen, wie man dem Problem Herr werden könnte?
Vielen Dank für deine Hilfe.

Gruß
TheBeginner
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

So lange das andere Programm darauf wartet, dass der Python-Interpreter fertig ist mit arbeiten, kannst du nichts ausrichten, da das aufrufende Programm das Problem darstellt. Wie kommst du jetzt eigentlich auf boost python? Das bringt dir nur etwas, wenn du Zugriff auf den Quellcode hast. Und wenn das der Fall ist, dann kannst du das Problem auch direkt lösen.

Sebastian
Das Leben ist wie ein Tennisball.
TheBeginner
User
Beiträge: 8
Registriert: Sonntag 29. Mai 2011, 17:56

Hallo zusammen,

vielen Dank für die rege Diskussion und die Anregungen.
Seht ihr irgendeine Möglichkeit, dieses Problem mit Python zu lösen oder ist das mit Python leider gar nicht zu machen? Was denkt Ihr? Bin schön langsam am Ende mit meinem Latein. Ich habe nochmal ein wenig gegoogelt und was über parallel Python gefunden. Hat damit jemand von Euch Erfahrungen bereits gesammelt? Oder meint ihr, das könnte mit Queues gehen?
Zugriff auf den Quellcode habe ich leider nicht und werde ich auch voraussichtlich nicht bekommen.
Ich bin noch dazu leider ein totaler Neuling in Sachen programmieren.

Gruß
TheBeginner
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Vergiss mal Python und jegliche Sprache.

Du hast ein Programm, welches zu einem definierten Zeitpunkt externe Daten anfordert. Ob diese nun durch ein Python-Script berechnet werden oder durch einen Benutzer eingegeben werden sei dabei egal. Das Programm arbeitet eben erst dann weiter, wenn es die Daten erhält. Insofern kannst Du dieses Problem nicht mittels Python lösen, sondern müsstest eben im FE-Programm etwas an der API ändern.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
TheBeginner
User
Beiträge: 8
Registriert: Sonntag 29. Mai 2011, 17:56

Hallo zusammen,

Hyperion hat hier einen gute Hinweis gegeben, wie ich mein Problem vielleicht noch genauer beschreiben könnte. Vielen Dank dafür.
Ich übergebe einen Befehl an ein Programm, welcher dann von dem Programm ausgeführt werden soll. Während das Programm arbeitet, soll das den Befehl übergebende Programm "stehenbleiben", ohne das ausführende Programm auch zum "stehenbleiben" zu bringen. Ich hoffe diese allgemeine Beschreibung hilft nun etwas weiter.
An dieser Stelle nochmal vielen Dank für Eure Hilfe.

Gruß
TheBeginner
problembär

Das ist ja schön und gut, aber wir können von hier aus nunmal nicht testen, wie genau sich das stehenbleibende Hauptprogramm verhält und ob man daran vielleicht etwas ändern könnte.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Es habe alle dein Problem verstanden und auch Hyperions Hinweis bezog sich darauf, dass es für dieses Problem, ohne Unterstützung des aufrufenden Programms oder dessen Anpassung, keine Lösung gibt.
Das Leben ist wie ein Tennisball.
Antworten