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?

Teifion
quelle
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.

Antti Rasinen
quelle
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)
lbz
quelle
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

dampfbetrieben
quelle
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.

Dave Webb
quelle
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

Vhaerun
quelle
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'>
Viswesn
quelle
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

Simon Peverett
quelle
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)
Matt Olan
quelle
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
CorpseDead
quelle
3

In Python 2:

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

In Python 3:

data = input('Enter something: ')
print(data)
Kennzeichen
quelle
2
import six

if six.PY2:
    input = raw_input

print(input("What's your name? "))
Will Charlton
quelle