Benutzereingaben und Befehlszeilenargumente [geschlossen]


525

Wie habe ich ein Python-Skript, das a) Benutzereingaben akzeptieren kann und wie ich es dazu bringe, b) Argumente einzulesen, wenn es über die Befehlszeile ausgeführt wird?


9
Die Antwort hängt von Ihrer Version von Python ab. Python 3.x macht dies ein wenig anders als Python 2.7
Steampowered

4
Und Python 2.7 macht das auch ein bisschen anders als die Versionen vor 2.7, zB argparsestatt optparse.
HelloGoodbye

Antworten:


501

Um Benutzereingaben zu lesen, können Sie das cmdModul zum einfachen Erstellen eines Mini-Befehlszeileninterpreters (mit Hilfetexten und automatischer Vervollständigung) und raw_input( inputfür Python 3+) zum Lesen einer Textzeile des Benutzers ausprobieren .

text = raw_input("prompt")  # Python 2
text = input("prompt")  # Python 3

Befehlszeileneingaben sind in sys.argv. Versuchen Sie dies in Ihrem Skript:

import sys
print (sys.argv)

Es gibt zwei Module zum Parsen von Befehlszeilenoptionen: optparse(seit Python 2.7 veraltet, argparsestattdessen verwenden) und getopt. Wenn Sie nur Dateien in Ihr Skript eingeben möchten, sehen Sie sich die Möglichkeiten von an fileinput.

Die Python-Bibliotheksreferenz ist dein Freund.


71
raw_inputwurde inputin Python 3.x umbenannt - Dokumentation hier
Steampowered


1
sys.argv muss mit der Argumentnummer angegeben werden, wenn Sie einen Parameter als Wert übergeben, z. python file_name.py 2017-02-10 und Sie möchten das Datum verwenden, es sollte sys.argv [1] sein, sonst wird es eine Liste wie [file_name.py, 2017-02-10]
Aravind Krishnakumar

467
var = raw_input("Please enter something: ")
print "you entered", var

Oder für Python 3:

var = input("Please enter something: ")
print("You entered: " + var)

26
Es sollte beachtet werden, dass Sie nicht importieren müssen raw_input, es ist eine eingebaute Funktion.
Dennis Golomazov

7
Sie müssen str () nicht für die Druckverkettung verwenden, da alle eingegebenen Daten standardmäßig vom Typ str (ing) sind (gerade Zahlen).
Goujon

202

raw_inputist in Python 3.x nicht mehr verfügbar. Wurde raw_inputaber umbenannt input, so besteht die gleiche Funktionalität.

input_var = input("Enter something: ")
print ("you entered " + input_var) 

Dokumentation der Änderung


24
In Python 2.7 konvertiert input () keine Werte in Zeichenfolgen. Wenn Sie dies versuchen: input_variable1 = input ("Geben Sie das erste Wort oder die erste Phrase ein:"), wird eine Fehlermeldung angezeigt: Traceback (letzter Aufruf zuletzt): return eval (raw_input (Eingabeaufforderung)) File "<string> ", Zeile 1, in <Modul> NameError: Name 'schlecht' ist nicht definiert
IgorGanapolsky

input_var = input ("Drücken Sie 'E' und 'Enter', um zu beenden:") NameError: Name 'e' ist nicht definiert. Ich verwende Python 2.5. Wie kann ich diesen Fehler überwinden?
Deepak Dubey

Sie können den Traceback-Hinweis vermeiden, indem Sie den folgenden Import verwenden, der mit Python 2.7 geliefert wird:import fileinput result=[] for line in fileinput.input(): result.append(line)
Stefan Gruenwald

Hier ist mehr von der Geschichte und der Begründung: python.org/dev/peps/pep-3111
Julian

33

Der beste Weg, um Befehlszeilenargumente zu verarbeiten, ist das argparseModul.

Verwenden Sie raw_input()diese Option , um Benutzereingaben abzurufen. Wenn Sie die importieren, haben readline moduleIhre Benutzer Zeilenbearbeitung und Verlauf.


readline ist jedoch nur unter Unix verfügbar.
wahnsinniger Igel

5
Argparse ist der neue Optparse
Niels Bom

18

Achten Sie darauf, die inputFunktion nicht zu verwenden , es sei denn, Sie wissen, was Sie tun. Im Gegensatz zu raw_input, inputwird jeden Python Ausdruck annehmen, so ist es ein bisschen wieeval


15

Dieses einfache Programm hilft Ihnen zu verstehen, wie Sie die Benutzereingaben über die Befehlszeile eingeben und Hilfe beim Übergeben ungültiger Argumente anzeigen.

import argparse
import sys

try:
     parser = argparse.ArgumentParser()
     parser.add_argument("square", help="display a square of a given number",
                type=int)
    args = parser.parse_args()

    #print the square of user input from cmd line.
    print args.square**2

    #print all the sys argument passed from cmd line including the program name.
    print sys.argv

    #print the second argument passed from cmd line; Note it starts from ZERO
    print sys.argv[1]
except:
    e = sys.exc_info()[0]
    print e

1) Um die Quadratwurzel von 5 zu finden

C:\Users\Desktop>python -i emp.py 5
25
['emp.py', '5']
5

2) Übergabe eines anderen ungültigen Arguments als der Nummer

C:\Users\bgh37516\Desktop>python -i emp.py five
usage: emp.py [-h] square
emp.py: error: argument square: invalid int value: 'five'
<type 'exceptions.SystemExit'>

10

Verwenden Sie 'raw_input' für die Eingabe von einer Konsole / einem Terminal.

Wenn Sie nur ein Befehlszeilenargument wie einen Dateinamen oder etwas anderes möchten, z

$ python my_prog.py file_name.txt

dann können Sie sys.argv verwenden ...

import sys
print sys.argv

sys.argv ist eine Liste, in der 0 der Programmname ist. Im obigen Beispiel wäre sys.argv [1] also "Dateiname.txt".

Wenn Sie vollständige Befehlszeilenoptionen wünschen, verwenden Sie das optparse-Modul.

Pev


9

Wenn Sie Python <2.7 ausführen , benötigen Sie optparse , das, wie im Dokument erläutert, eine Schnittstelle zu den Befehlszeilenargumenten erstellt, die beim Ausführen Ihrer Anwendung aufgerufen werden.

In Python ≥2.7 ist optparse jedoch veraltet und wurde wie oben gezeigt durch argparse ersetzt . Ein kurzes Beispiel aus den Dokumenten ...

Der folgende Code ist ein Python-Programm, das eine Liste von Ganzzahlen verwendet und entweder die Summe oder das Maximum erzeugt:

import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
                   help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
                   const=sum, default=max,
                   help='sum the integers (default: find the max)')

args = parser.parse_args()
print args.accumulate(args.integers)


6

Wenn es sich um eine 3.x-Version handelt, verwenden Sie einfach:

variantname = input()

Zum Beispiel möchten Sie 8 eingeben:

x = input()
8

x ist gleich 8, aber es wird eine Zeichenfolge sein, es sei denn, Sie definieren es anders.

Sie können also den Befehl convert verwenden, z. B.:

a = int(x) * 1.1343
print(round(a, 2)) # '9.07'
9.07

3

In Python 2:

data = raw_input('Enter something: ')
print data

In Python 3:

data = input('Enter something: ')
print(data)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.