facebraker
Goto Top

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.

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 face-sad

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 face-wink

Danke für Eure Hilfe.

Gruß Alex

Content-ID: 205433

Url: https://administrator.de/contentid/205433

Ausgedruckt am: 25.11.2024 um 20:11 Uhr

64748
64748 22.04.2013 aktualisiert um 17:47:51 Uhr
Goto Top
Hallo Alex,

ich bin weder Programmierer noch hab ich Ahnung von Python. Also beste Voraussetzungen face-wink

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?

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
facebraker
facebraker 22.04.2013 um 19:09:06 Uhr
Goto Top
Hallo Markus,

eigentlich kein großes Linux Problem, ich rufe das Programm einmal mit den Argumenten XYZ auf für die erste Messung, die in einer Endlosschleife immer Daten liefert.
Ist in den Daten ein bestimmter String , soll die erste Messung unterbrochen werden (gekillt) (child_mess.close(force=True)
und dann das selbe Programm mit den Argumenten ABC gestartet werden, das liefert mir nur einen einzigen String, den ich weiter verarbeite

jetzt kommt es

Nun möchte ich die erste Endlosschleife wieder starten und weiter arbeiten lassen und Daten liefern, bis wieder der bestimmt String kommt, und abgearbeitet wird.

Ich würde IMHO sagen, kein Linux Problem, weil das Programm wird einmal so und einmal anders gestartet, es weiß nichts mehr und interessiert es auch nicht.

Mein Problem ist, wie kann ich nach der speziellen Messung (die abgeschlossen ist) die erste Endlosschleife wieder ausführen.

Im Moment sieht es so aus:

Starte das Programm

Endloschleife
ich höre ob es einen bestimmten String kommt
geht in die funktion
Es wird der bestimmte String erkannt
Prozess wird beendet
eine spezielle Messung wird gemacht und Liefert ergebnis
Er kehrt in die Endlosschleife zurück

Versucht zu hören und merkt, dass das Programm nicht gestartet ist
FEHLER

Auch ein Start des Programms innerhalb der Endlosschleife klappt nicht auch mit
Variablen nicht, die es steuern.


Gruß Alex