Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Ablaufproblem mit pexpect

Frage Entwicklung Python

Mitglied: facebraker

facebraker (Level 1) - Jetzt verbinden

22.04.2013 um 15:05 Uhr, 1705 Aufrufe, 2 Kommentare, 1 Danke

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.

01.
if __name__ == "__main__": 
02.
 
03.
    child_mess = pexpect.spawn ('get_mess.bin -C s1') 
04.
 
05.
    while True: 
06.
        try: 
07.
            child_mess.expect('measurement okay') 
08.
            process_sensor(child_mess.before) 
09.
        except KeyboardInterrupt: 
10.
            child_mess.close(force=True) 
11.
            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.

01.
def process_sensor(sensor_text): 
02.
   str1 = remove_tags(sensor_text) 
03.
   str2 = str1.replace('sensor1: ','') 
04.
   transcribed = str2 
05.
   if transcribed.finde("123"): 
06.
      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:

01.
def process_sensor(sensor_text): 
02.
   str1 = remove_tags(sensor_text) 
03.
   str2 = str1.replace('sensor1: ','') 
04.
   transcribed = str2 
05.
   if transcribed.finde("123"): 
06.
       child_mess.close(force=true) 
07.
                 os.system("get_mess.bin -T s1") 
08.
        else: 
09.
                 #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


Mitglied: hmarkus
22.04.2013, aktualisiert um 17:47 Uhr
Hallo Alex,

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?

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
Bitte warten ..
Mitglied: facebraker
22.04.2013 um 19:09 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...