2016-04-17 15 views
0

Ich bin neu in der Programmierung. Ich schaute mir Tutorials an, aber ich bin nur noch verwirrter. Aber was ich versuche zu tun ist, stdin und stdout zu verwenden, um Daten aufzunehmen, Argumente zu übergeben und Ausgabeergebnisse auszugeben.Python - Wie argv auf der Kommandozeile mit stdin/stdout parsen?

Also im Grunde, auf der Kommandozeile, wird der Benutzer die und ein Argument eingeben.

Die Argumente sind:

i = sys.argv [1] 

f = sys.argv [2] 

w = sys.argv [3] 

dann zu verwenden, wenn/sonst wird das Programm einige Dinge ausführen basierend auf welches Argument oben gewählt.

heißt: Auf der Kommandozeile wird der Benutzer den Namen des Skripts eingeben und f (für sys.argv[2:2])

$ test.py f 

.

if sys.argv == i: 
    #execute some stuff 

elif sys.argv == f: 
     #execute some stuff 

else: 
    sys.argv == w 
    #execute some stuff 

Mit stdin/stdout wie kann ich diesen Schalter schaffen, in dem das Programm einen Teil des Code ausführt basierend auf welcher argv gewählt? Jede Eingabe wird sehr geschätzt.

+0

argpase wird in Ordnung sein, wenn ich es damit verwenden kann stdin/stdout – brazjul

+0

Ich werde keine anderen Vorschläge nehmen. Ich denke nicht, dass ich versuche zu arbeiten. – brazjul

+0

'sys.argv' ist eine Liste von Befehlszeilenparametern und nicht dasselbe wie stdin/stdout, die Pseudodateien sind. Das Lesen von stdin verwendet 'raw_input()' in Python 2, in Python 3 'input()'. – cdarke

Antwort

4

Es sieht aus wie Sie sind ein bisschen verwirrt über sys.argv. Es ist eine Liste der Parameter, die Sie Ihrem Programm beim Start gegeben haben. Wenn Sie also python program.py f ausführen, wird es ["program.py", "f"] sein. Wenn Sie es als python program.py f w i ausführen, wird es ["program.py", "f", "w", "i"] sein. Also der Code, den Sie zeigten:

i = sys.argv[1] 
f = sys.argv[2] 
w = sys.argv[3] 

wird eine Ausnahme auslösen, wenn Sie das Programm mit weniger als 3 Parameter aufrufen.

Es gibt einige Bibliotheken, die Ihnen bei der Analyse von Parametern wie argparse oder click helfen. Aber in einfachen Fällen ist die Verwendung von sys.argv wahrscheinlich einfacher.

Es sieht so aus, als ob Ihr Programm in drei Modi arbeiten soll: i, f und w.

if len(sys.argv) > 2: 
    print("Please only call me with one parameter") 
    sys.exit() 

if sys.argv[1] == "f": 
    #do some stuff 
elif sys.argv[1] == "i": 
    #do some other stuff 
elif sys.argv[1] == "w": 
    #do some more other stuff 
else: 
    print("Only accepted arguments are f, i and w") 
    sys.exit() 

Sie schreiben über print oder sys.stdout.write() nach stdout, wo der erste, der eine Zeilenumbrüche zu jeder Saite Eingabe hinzufügen.

Wenn Sie den Benutzer interaktiv Eingang etwas wollen, sollten Sie input() verwenden (raw_input() in python2. Es input() die Aussage als Python-Code auswertet, die Sie fast immer nicht wollen).

Wenn Sie etwas mit vielen Daten tun möchten, sind Sie wahrscheinlich am besten dran, wenn Sie einen Pfad zu Ihrem Programm übergeben und dann eine Datei einlesen. Sie können auch stdin über sys.stdin.read() verwenden, aber dann möchten Sie etwas dort übergeben entweder über ein Rohr some-other-program | python program.py f oder eine Datei lesen python program.py f < file.txt. (Theoretisch könnten Sie auch stdin verwenden, um interaktive Daten zu lesen, aber tun Sie das nicht, verwenden Sie stattdessen Eingabe.)

+0

Danke, ich habe meine Antwort bearbeitet, um zu reflektieren, wann ich stdin/input verwenden soll. Wenn Sie weitere Informationen haben, können Sie diese gerne bearbeiten. – syntonym

+0

Kühl. Und vielen Dank für die Gefahr, Python 2 'input' zu benutzen. –