ping mit python

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Du wirklich python benutzen willst, dann brauchst Du nicht auch noch tr und awk, denn das alles kann Python auch:

Code: Alles auswählen

import subprocess
import time

IP = "192.168.0.1"
pr = subprocess.Popen(["ping", "-D", IP], stdout=subprocess.PIPE):
for line in pr.stdout:
    if line.startswith('['):
        timestamp, line = line.strip().split(']', 1)
        timestamp = time.strftime("%H:%M:%S", time.localtime(float(timestamp[1:])))
        line = timestamp + line
    print(line)
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Danke für den Code, das hab ich gesucht.
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Hab gerade mal den Code ausprobier, aber da kommt die Fehlermeldung:

Code: Alles auswählen

if line.startswith('['):
TypeError: startswith first arg must be bytes or a tuple of bytes, not st]
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die line ist ein bytes-objekt, das kann nicht mit einem string angfangen (seit Python 3). Du kannst das mit einem encoding-Argument an den subprocess-call loesen.
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

egon11 hat geschrieben: Donnerstag 17. Mai 2018, 17:53 Aber wenn ich das 1:1 in den Python Script einbaue, dann bleibt die Datei leer.
Dafür war es auch nicht gedacht, sondern als eigenständige Alternative für ein Python-Skript. Ich hatte ja in meinem letzten Beitrag versucht deutlich zu machen, dass man genau das -- nämlich komplexe Shell-Konstrukte mit Python ausführen -- meiner Meinung nach nicht machen sollte. Sirius3 hat ja gezeigt, wie man sinnvoll mit Subprocess arbeitet.
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Jetzt hatte ich wieder Zeit und hab mich mal wieder mit den Script beschäftigt. Ich hab es jetzt so hinbekommen, so wie ich es haben möchte.
Aber ob das Inhaltlich und fachlich in Ordnung ist, das weiß ich nicht.
Hier der Code:

Code: Alles auswählen

import subprocess
from datetime import datetime

IP = "192.168.178.1"
pr = subprocess.Popen(["ping", IP], stdout=subprocess.PIPE)

for line in pr.stdout:
    data = datetime.now().strftime('%H:%M:%S--%d-%m-%Y')
    ping1 = str(line)
    ping = data + "  "  + ping1 + "\n"
    txt = open("/home/matze/pingtime.txt", "a")
    txt.write(ping)
    txt.close()
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Dateien öffnet man am besten mit dem with-Statement und nutzt Stringformatierung. Da line schon ein String ist, ist das nochmalige umwandeln unnötig. Die Zeit, die Du da anhängst, ist nicht die, zu der der Ping abgesetzt wurde, sondern die, zu der Du die Zeile liest. Daher ist die Variante, wo ping die Zeitstempel schreibt generell besser.

Code: Alles auswählen

import subprocess
from datetime import datetime as DateTime

IP = "192.168.178.1"
pr = subprocess.Popen(["ping", IP], stdout=subprocess.PIPE)
with open("/home/matze/pingtime.txt", "a") as output:
    for line in pr.stdout:
        output.write("{:%H:%M:%S--%d-%m-%Y} {}".format(DateTime.now(), line))
        output.flush()
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Danke für die schnelle Hilfe, ich habe aber das etwas abgeändert zwecks Zeilenumbruch. Kann ich das so stehen lassen?

Code: Alles auswählen

import subprocess
from datetime import datetime as DateTime

IP = "192.168.178.1"
pr = subprocess.Popen(["ping", IP], stdout=subprocess.PIPE)
with open("/home/matze/pingtime.txt", "w") as output:
    for line in pr.stdout:
        line = ("{:%H:%M:%S--%d-%m-%Y} {}".format(DateTime.now(), line)) + "\n"
        output.write(line)
        output.flush()
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Der Zeilenumbruch sollte schon in der Ausgabe von ping sein, Du hast also dann immer Leerzeilen; wenn Du das willst, dann so:

Code: Alles auswählen

        output.write("{:%H:%M:%S--%d-%m-%Y} {}\n".format(DateTime.now(), line))
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Ja der Zeilenumbruch sollte eigentlich in der ping-Ausgabe sein, aber es schreibt "\n" statt den Zeilenumbruch durchzuführen.

Aber Danke an allen. Das Thema ist erledigt. :) :) :)
Antworten