2016-05-17 9 views
0

Im Wesentlichen möchte ich ein Skript mit mehreren Optionen erstellen, um bestimmte Daten auf einem Hostnamen zu überprüfen. Zum Beispiel hat der Code hier eine Option zum Pingen oder Ausführen eines tracert auf einem gegebenen Hostnamen.Wie schreibe ich einen Befehl von der Eingabeaufforderung in eine Datei mit Python?

Der obige Code funktioniert und ich kann die Ergebnisse erhalten und manuell kopieren, aber ich möchte, dass dies automatisch erfolgt. Ich weiß, dass ich Dateien öffnen kann so etwas wie

p = open("ping1.txt", "w") 

verwenden, aber ich bin nicht sicher, wie die Ergebnisse der Spur oder den Ping von der Eingabeaufforderung kopieren? Jede Hilfe wäre willkommen.

+0

Meinst du die Ausgabe in eine Datei schreiben? –

+0

Ja, ich möchte, dass der Befehl in der Eingabeaufforderung ausgeführt wird und anschließend in eine Datei geschrieben wird, um sie später anzuzeigen. – Matt

+0

Mögliches Duplikat von [python Speichern Sie die Ausgabe eines Shell-Befehls in eine Textdatei] (http://stackoverflow.com/questions/20421187/python-save-the-output-of-a-shell-command-into-a -text-Datei) – skrrgwasme

Antwort

0

Sie können subprocess.Popen verwenden, um die Ausgabe und Schreiben in eine Datei zu sehen:

from subprocess import Popen, PIPE 
print("""What did you want to run? (pick a number) 
     (1) Ping 
     (2) Traceroute""") 

runit = raw_input("> ") 

print ("Enter a hostname to check") 
host = raw_input("> ") #accept input for hostname 

if runit == "1": 
    p = Popen("cmd /c ping " + host, shell=True, stdout=PIPE) 
    with open("ping.txt","w") as f: 
     for line in iter(p.stdout.readline,""): 
      print(line) 
      f.write(line) 

elif runit == "2": 
    p = Popen("cmd /c tracert " + host, shell=True, stdout=PIPE) 
    with open("trace.txt", "w") as f: 
     for line in iter(p.stdout.readline, ""): 
      print(line) 
      f.write(line) 

zu halten, den Code trocken und ermöglicht es einem Benutzer wieder zu wählen, ob sie die falsche Wahl verwenden, können Sie eine while-Schleife verwenden mit str.format mit einem dict die Optionen zu halten:

from subprocess import Popen, PIPE 

opts = {"1": "ping", "2": "tracert"} 

while True: 
    print("""What did you want to run? (pick a number) 
      (1) Ping 
      (2) Traceroute""") 
    runit = raw_input("> ") 
    if runit in opts: 
     host = raw_input("Enter a hostname to check\n> ") # accept input for hostname 
     p = Popen("cmd /c {} {}".format(opts[runit], host), shell=True, stdout=PIPE) 
     with open("ping.txt", "w") as f: 
      for line in iter(p.stdout.readline, ""): 
       print(line) 
       f.write(line) 
     break 
    print("Invalid option") 
+0

Ja, das funktioniert genauso wie ich gehofft hatte. Danke vielmals! ein wenig vertraut mit Subprozessargumenten wie shell = 1, stdout = PIPE, aber ich habe die Seite gefunden und werde mehr darüber lesen. Ich verstehe den Rest und schätze es! – Matt

+0

Keine Sorge, Sie können normalerweise damit davonkommen, eine Liste einzelner Argumente zu übergeben, ohne shell = True zu setzen, aber ich benutze keine Fenster, daher bin ich mir nicht sicher, ob das funktionieren wird oder nicht Verwenden Sie das Fenster –

+0

1- Sie könnten stattdessen 'stdout = file' verwenden 2- Sie müssen den Code nicht wiederholen. Vergleichen Sie mit [dies] (http://stackoverflow.com/a/37311520/4279) – jfs

0

os.system(command) führen den Befehl in einer Subshell und gibt dessen Exit-Status auf den meist System (zumindest für cmd.exe).

Das subprocess Modul ist viel dafür geeignet, irgendetwas mehr als das zu tun.

Wahrscheinlich möchten Sie subprocess.check_output verwenden, die den Befehl mit Argumenten ausführt und seine Ausgabe als Byte-Zeichenfolge zurückgibt.

subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)` 
+0

Sobald Sie die Ausgabe als Byte-String haben, sollte der Rest trivial sein. "Subprocess.check_output()" ist wahrscheinlich nicht geeignet, wenn der Befehl nicht wie mit terminiert ausgeführt wird 'ping' wenn Sie keine' -c Anzahl angeben . Dann ist die von Padraic Cunningham vorgeschlagene Lösung besser! –

-1

Um die Ausgabe eines Befehls in eine Datei zu umleiten, Sie stdout Parameter subprocess.check_call() passieren könnte:

#!/usr/bin/env python2 
import subprocess 

one_or_two = raw_input("""What did you want to run? (pick a number) 
     (1) Ping 
     (2) Traceroute 
> """) 
command = ["", "ping", "tracert"][int(one_or_two)] 
host = raw_input("Enter a hostname to check\n> ") 

with open('output.txt', 'wb', 0) as file: 
    subprocess.check_call([command, host], stdout=file) 

Wenn Sie das Kopieren der Ausgabe die Ausgabe in der Konsole zusätzlich angezeigt werden sollen zu einer Datei, siehe Displaying subprocess output to stdout and redirecting it.