Forum: PC-Programmierung [Pyhton] Bash Ausgabe zweilenweise parsen und in Array schreiben


von Rene K. (xdraconix)


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?

von Yalu X. (yalu) (Moderator)


Lesenswert?

1
lines = varOut.readlines()

lines ist dann ein Array aller Zeilen.

von Rene K. (xdraconix)


Lesenswert?

Yalu X. schrieb:
> lines = varOut.readlines()
>
> lines ist dann ein Array aller Zeilen.

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

von Sheeva P. (sheevaplug)


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

von Oliver (imonbln)


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.

von Rene K. (xdraconix)


Lesenswert?

Ja Subprocess habe ich mir angeschaut und sieht super soweit aus. Auch 
das man die Argumente separat anfügen kann, kommt der Sache schon sehr 
entgegen.

Ich habe aber noch eine andere Möglichkeit gefunden an die Daten zu 
kommen, als über eine Komandozeile. Dazu muss ich aber eine XML Datei 
parsen.

Siehe hier: Beitrag "[Python] XML Parsen"

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.