[Pyhton] Bash Ausgabe zweilenweise parsen und in Array schreiben

OP #7430158
Lesenswert?

Ich habe Platten an einem SAS Controller von HP hängen, um dort ein "Lüftersteuerung" zu bauen. Möchte ich gerne über ein Python Script den Controller auslesen, die Temperaturen ermitteln und daraufhin die Lüfter steuern.

Ich scheitere aber aktuell daran, die Ausgabe in Zeilen zu parsen. Ich gebe mal den Teil des Python Scripts und die Ausgabe, vielleicht kann mich ja einer auf den richtigen Weg schubsen.

snippet Python Script:

1
import os
2

3
varOut = os.popen("ssacli ctrl slot=0 pd all show detail | grep Temperature | awk {'print $4'}")
4

5
print(varOut.read())

Als Ausgabe bekomme ich dann folgendes:

1
48
2
46
3
50
4
48
5
43

Diese einzelnen Zeilen, würde ich dann gerne halt in Variablen haben, nur weiß ich nicht wie da anfangen kann, dies in Zeilen aufzudröseln.

Jemand ein Gedankenanstoß für mich?

#7430276
Lesenswert?

Rene K. schrieb:

Yalu X. schrieb:

lines = varOut.readlines()

lines ist dann ein Array aller Zeilen.

Ahhh wunderbar! Genau das was ich gesucht habe. Danke dir vielmals!

Ja, also, äh... hüstel Das löst zwar kurzfristig Dein Problem, ist aber mit modernen Python-Interpretern nicht so richtig elegant. Mit dem Modul "subprocess" [1] hast Du wesentlich mehr Kontrolle über Deinen Prozeß, inklusive:

  • konfigurierbare Ein- und Ausgabe(n) des Subprozesses in einem oder zwei io.TextIOWrapper oder io.BytesIOWrapper mit en- und decoding
  • Timeout für den Subprozeß
  • Angabe des Environment für den Subprozeß
  • Kontrolle des Rückgabewertes

...und so weiter, das gerade Aufgezählte betrifft lediglich die Funktion "subprocess.run()". Mit der Klasse "subprocess.Popen" hast Du sogar noch genauere Kontrolle über den Subprozess und seine Interaktion mit Python, damit kannst Du den Subprozess sogar im Hintergrund starten und dann die Ausgaben pollen und verarbeiten, während er noch läuft.

Um Unfälle und Fehleranfälligkeiten zu vermeiden, bietet sich im Übrigen das Modul "shlex" an, das Deine Kommandozeile in einen sauber gequotetes und escapetes Array umwandelt. Damit wird es für fiese Mistfinken schwer, Deinem Subprozess irgendwelche bösen Ferkeleien unterzujubeln.

Wenn Du Deinen Subprozess nicht lokal, sondern remote auf einer Maschine ausführen willst, auf die Du mit SSH zugreifen kannst, lohnt sich sicher auch ein Blick auf fabric2 [3, 4], das genau dieses macht -- mit Optionen zur Privilegienerweiterung via sudo(1) und allem Pipapo.

Viel Spaß und Erfolg!

[1] https://docs.python.org/3/library/subprocess.html [2] https://docs.python.org/3/library/shlex.html [3] https://www.fabfile.org/ [4] https://docs.fabfile.org/en/stable/index.html

#7430638
Lesenswert?

Wie schon mein Vorredner geschrieben hat, empfiehlt die Python Community das subprocess Module stat os.popen zu verwenden. Der Empfehlung solltest du folgen. Ergänzen möchte ich noch, dass dein Ansatz mit grep und awk im os.popen vorzufiltern etwas suboptimal ist, da werden unnötig Ressourcen vom Kernel geladen für Aufgaben, welche dein Python Interpreter auch wunderbar selbst erledigen kann. Vielleicht macht es dein Programm langfristig auch robuster, wenn es das Filtern selbst übernimmt und nicht einfach stumpf davon ausgeht, dass die Zahlenstrings schon richtig sind.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren