[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?

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

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

Eine eigene Frage? Dieser Thread ist über 3 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.