Ablaufproblem mit pexpect
Bei einen Problem auf einen Linux-Rechner, bin ich auf Python gestoßen und finde die Sprache sehr praktisch, natürlich muss man sich erst einmal daran gewöhnen an die Einrückungen in den Schleifen etc.pp.
Mein Problem ist relativ schnell umschrieben, ich lese in einer Endlosschleife Ausgaben eines Programms aus das Messfühler abfragt. Das mache ich mit pexpect sehr genial, würde es pexpect nicht geben, müsste man es erfinden.
Das funktioniert sehr gut, ich starte den Prozess, wenn er den Text "measurement okay" entdeckt, übergibt er die vorherige Ausgabe an die Funktion process_mess()
Das wird sie bereinigt und die relevanten Messdaten gefiltert.
Diese Prüfe ich dann in einer letzten Funktion auf den richtigen Sensor.
Soweit alles toll, ich prüfe nun ob es "123" ist, ist es das soll ich neue speziellere Messung passieren.
Das geht natürlich nicht da das Programm noch von dem ersten Prozess child_mess belegt ist und ich kann auch keinen neuen Prozessstarten, weil der Sensor noch
vom ersten Programm belegt ist.
Ich muss also den ersten Prozess child_mess beenden, dann kann ich meine speziellere Messung starten, wenn diese dann fertig ist fehlt mir der erste Prozess.
Klar ich habe ihn beendet:
Wenn er dann wieder in die Endlosschleife in Main zurückkehrt, ist der Prozess nicht mehr da
Wie kann ich das Programm anlegen, so dass er wenn "123" kommt den ersten Prozess beendet, die spezielle Messung vornimmt und dann den Prozess wieder startet.
Wenn andere Werte außer "123" kommen, dann soll er normal weiter machen?
Hoffe ihr habt einen Denkanstoß für mich
Danke für Eure Hilfe.
Gruß Alex
Mein Problem ist relativ schnell umschrieben, ich lese in einer Endlosschleife Ausgaben eines Programms aus das Messfühler abfragt. Das mache ich mit pexpect sehr genial, würde es pexpect nicht geben, müsste man es erfinden.
if __name__ == "__main__":
child_mess = pexpect.spawn ('get_mess.bin -C s1')
while True:
try:
child_mess.expect('measurement okay')
process_sensor(child_mess.before)
except KeyboardInterrupt:
child_mess.close(force=True)
break
Das funktioniert sehr gut, ich starte den Prozess, wenn er den Text "measurement okay" entdeckt, übergibt er die vorherige Ausgabe an die Funktion process_mess()
Das wird sie bereinigt und die relevanten Messdaten gefiltert.
Diese Prüfe ich dann in einer letzten Funktion auf den richtigen Sensor.
def process_sensor(sensor_text):
str1 = remove_tags(sensor_text)
str2 = str1.replace('sensor1: ','')
transcribed = str2
if transcribed.finde("123"):
os.system("get_mess.bin -T s1")
Soweit alles toll, ich prüfe nun ob es "123" ist, ist es das soll ich neue speziellere Messung passieren.
Das geht natürlich nicht da das Programm noch von dem ersten Prozess child_mess belegt ist und ich kann auch keinen neuen Prozessstarten, weil der Sensor noch
vom ersten Programm belegt ist.
Ich muss also den ersten Prozess child_mess beenden, dann kann ich meine speziellere Messung starten, wenn diese dann fertig ist fehlt mir der erste Prozess.
Klar ich habe ihn beendet:
def process_sensor(sensor_text):
str1 = remove_tags(sensor_text)
str2 = str1.replace('sensor1: ','')
transcribed = str2
if transcribed.finde("123"):
child_mess.close(force=true)
os.system("get_mess.bin -T s1")
else:
#mache irgendwas da braucht man die Messung nicht
Wenn er dann wieder in die Endlosschleife in Main zurückkehrt, ist der Prozess nicht mehr da
Wie kann ich das Programm anlegen, so dass er wenn "123" kommt den ersten Prozess beendet, die spezielle Messung vornimmt und dann den Prozess wieder startet.
Wenn andere Werte außer "123" kommen, dann soll er normal weiter machen?
Hoffe ihr habt einen Denkanstoß für mich
Danke für Eure Hilfe.
Gruß Alex
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 205433
Url: https://administrator.de/contentid/205433
Ausgedruckt am: 25.11.2024 um 20:11 Uhr
2 Kommentare
Neuester Kommentar
Hallo Alex,
ich bin weder Programmierer noch hab ich Ahnung von Python. Also beste Voraussetzungen
Eine Verständnisfrage:
Oder ist es so, dass es quasi zwei Funktionen sind, die sich wechselseitig aufrufen? Denn dann wäre es ja einfach, also dass die Funktion, die die spezielle Messung vornimmt die ursprüngliche Funktion wieder aufruft.
Wenn es allerdings darum geht, nur den Prozess zu unterbrechen, dann musst Du der Funktion für die spezielle Messung die PID des Elternprozesses mitgeben.
http://www.linux-praxis.de/linux1/prozess.html und http://www.willemer.de/informatik/unix/unprfork.htm wären zu lesen. Es ist eigentlich kein Python-Problem. Es geht um Unix-Prozesse und die werden von allen Programmiersprachen, einschließlich der Shell, auf jedem Unix/Linux-System unterstützt.
Oder der Elternprozess wartet darauf, dass der Kindprozess abgeschlossen ist.
Markus
ich bin weder Programmierer noch hab ich Ahnung von Python. Also beste Voraussetzungen
Eine Verständnisfrage:
Wie kann ich das Programm anlegen, so dass er wenn "123" kommt den ersten Prozess beendet, > die spezielle Messung vornimmt und dann den Prozess wieder startet.
Wenn andere Werte außer "123" kommen, dann soll er normal weiter machen?
Bedeutet das, dass der erste Prozess nur unterbrochen wird, aber mit der gleichen PID wie vorher wieder aufgenommen werden soll?Wenn andere Werte außer "123" kommen, dann soll er normal weiter machen?
Oder ist es so, dass es quasi zwei Funktionen sind, die sich wechselseitig aufrufen? Denn dann wäre es ja einfach, also dass die Funktion, die die spezielle Messung vornimmt die ursprüngliche Funktion wieder aufruft.
Wenn es allerdings darum geht, nur den Prozess zu unterbrechen, dann musst Du der Funktion für die spezielle Messung die PID des Elternprozesses mitgeben.
http://www.linux-praxis.de/linux1/prozess.html und http://www.willemer.de/informatik/unix/unprfork.htm wären zu lesen. Es ist eigentlich kein Python-Problem. Es geht um Unix-Prozesse und die werden von allen Programmiersprachen, einschließlich der Shell, auf jedem Unix/Linux-System unterstützt.
Oder der Elternprozess wartet darauf, dass der Kindprozess abgeschlossen ist.
Markus