Seite 1 von 1

subprcess.popen mit Listen

Verfasst: Dienstag 4. August 2020, 14:18
von noni
Guten Tag,

ich habe folgendes Problem:

ich habe eine Reihe von Logs gesucht, die z.b. 5 Tage her sind, diese logs habe ich dann in eine Liste gespeichert. Z.B:
syslog.2.gz
syslog.3.gz

Nun will ich im folgenden, die Dateien lesen und dann nach einem Datum und einer Uhrzeit suchen, dies steht schon im richtigen Format in der Variable "absoluttime"
damit ich aber auch in den .gz Dateien lesen kann und gegebenfalls die auch löschen kann, gebe ich sie mir mit zcat aus. Ich bekomme so zwar keine Fehlermeldung. Wenn ich aber mir dann "out2" ausgeben möchte, steht da leider nichts drin. Im Internet habe ich so jetzt nichts gefunden. Kann mir da vielleicht jemand weiterhelfen?

i = 0
for i in range(1, len(list)):
print("Das ist es nun", list)
var = subprocess.Popen('zcat %s | grep %s' %(list,absoluttime), stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
out2, err = var.communicate()
i = i + 1
print(out2)

Re: subprcess.popen mit Listen

Verfasst: Dienstag 4. August 2020, 14:54
von sparrow
Bitte setze deinen Code in Code-Tags. Die erscheinen wenn man den </>-Button drückt, wenn man den "Vollständigen Editor & Vorschau" benutzt.

Eine for-Schleife mit range ist ist in Python ein Anti-Pattern. Stattdessen iteriert man direkt über die Elemente der Liste:

Code: Alles auswählen

for element in list:
Ich an deiner Stelle würde das gzip Modul aus der Standard-Bibliothke verwenden statt ein externes Kommando zu verwenden.

Re: subprcess.popen mit Listen

Verfasst: Dienstag 4. August 2020, 14:55
von Sirius3
Zum Arbeiten mit gezippten Dateien gibt es das gzip-Modul, dafür benutzt man keine externen Programme.
Über einen Index iteriert man nicht, sondern über die Elemente der Liste direkt. Das i=0 und i = i + 1 sind zusätzlich ziemlich sinnlos, weil Du eine for-Schleife hast.
var ist ein sehr schlechter Name für ein POpen-Objekt.
list ist der Name des eingebauten List-Typs, der sollte nicht mit irgendwelchen Daten überschrieben werden.

Re: subprcess.popen mit Listen

Verfasst: Dienstag 4. August 2020, 16:05
von noni
Sirius3 hat geschrieben: Dienstag 4. August 2020, 14:55 Zum Arbeiten mit gezippten Dateien gibt es das gzip-Modul, dafür benutzt man keine externen Programme.
Über einen Index iteriert man nicht, sondern über die Elemente der Liste direkt. Das i=0 und i = i + 1 sind zusätzlich ziemlich sinnlos, weil Du eine for-Schleife hast.
var ist ein sehr schlechter Name für ein POpen-Objekt.
list ist der Name des eingebauten List-Typs, der sollte nicht mit irgendwelchen Daten überschrieben werden.
Vielen Dank! Ich hab das jetzt auch hinbekommen und konnte auch dann in den Dateien löschen. Nur habe ich jetzt keine gegebene Delete Funktion gefunden.
Also wenn ich zum Beispiel sage ich möchte die Log-Einträge vom 30. Juli um 15:00 löschen, kann ich die nicht so einfach damit löschen richtig?

Re: subprcess.popen mit Listen

Verfasst: Dienstag 4. August 2020, 17:13
von __blackjack__
@noni: Richtig. Etwas aus Textdateien löschen, und das gilt auch für komprimierte Textdateien, heisst das man die Datei neu schreiben muss, ohne die Zeilen die man nicht mehr haben möchte.

Um das robust zu machen, schreibt man üblicherweise erst in eine Temporäre Datei im gleichen Verzeichnis und benennt am Ende die neue Datei in die alte um. Sonst kann es bei Programmabbruch passieren, dass Daten verloren gehen.

Das mit dem ``grep`` funktioniert übrigens auch nur wenn man sicherstellt, dass das Muster nur an der richtigen Stelle gesucht wird. Wenn da also nur nach "Jul 30 15:00:00", ohne das am Zeilenanfang zu verankern, könnte das auch Zeilen erfassen wo dieser Wert woanders innerhalb der Zeile steht. Wenn man das in Python ausdrückt, sollte man `startswith()` verwenden und nicht den ``in``-Operator.