Argumenty wprowadzone przez użytkownika i wiersza polecenia [zamknięte]

525

Jak mam skrypt w języku Python, który: a) może akceptować dane wejściowe użytkownika i jak go zmusić, b) wczytywać argumenty, jeśli są uruchamiane z wiersza poleceń?

Teifion
źródło
9
Odpowiedź będzie zależeć od twojej wersji Pythona. Python 3.x robi to trochę inaczej niż Python 2.7
steampowered
4
Python 2.7 robi to również nieco inaczej niż wersje wcześniejsze niż 2.7, np. argparseZamiast optparse.
HelloGoodbye

Odpowiedzi:

501

Aby odczytać dane wprowadzone przez użytkownika można wypróbować ten cmdmoduł do łatwego tworzenia linii mini-interpreter poleceń (z tekstów pomocy i autouzupełniania) i raw_input( inputdla Pythona 3+) do czytania wiersza tekstu od użytkownika.

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

Wejścia wiersza poleceń są w sys.argv. Wypróbuj to w swoim skrypcie:

import sys
print (sys.argv)

Istnieją dwa moduły do ​​analizowania opcji wiersza poleceń: optparse(przestarzałe od Python 2.7, argparsezamiast tego używaj ) i getopt. Jeśli chcesz tylko wprowadzić pliki do skryptu, zobacz moc fileinput.

Referencyjna biblioteka Pythona jest twoim przyjacielem.

Antti Rasinen
źródło
71
raw_inputzostał zmieniony na inputPython 3.x - tutaj dokumentacja
steampowered
1
sys.argv musi zostać podany z argumentem numer, jeśli załóżmy, że przekazujesz parametr jako wartość np. python nazwa_pliku.py 10.02.2017 i chcesz użyć daty, powinna to być sys.argv [1], w przeciwnym razie będzie to lista taka jak [nazwa_pliku.py,
10.02.2017
467
var = raw_input("Please enter something: ")
print "you entered", var

Lub dla Python 3:

var = input("Please enter something: ")
print("You entered: " + var)
lbz
źródło
26
Należy zauważyć, że nie trzeba importować raw_input, jest to wbudowana funkcja.
Dennis Golomazov
7
Nie musisz używać str () w konkatenacji drukowania, ponieważ wszystkie wprowadzone dane będą domyślnie typu str (ing) (liczby parzyste).
Goujon
202

raw_inputnie jest już dostępny w Pythonie 3.x. Ale raw_inputzostał przemianowany input, więc istnieje ta sama funkcjonalność.

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

Dokumentacja zmiany

steampowered
źródło
24
W Pythonie 2.7 input () nie konwertuje wartości na łańcuchy. Więc jeśli spróbujesz to zrobić: input_variable1 = input („Wpisz pierwsze słowo lub frazę:”), pojawi się błąd: Traceback (ostatnie ostatnie połączenie): return eval (raw_input (monit)) Plik „<ciąg> ", wiersz 1, w <module> NameError: nazwa 'bad' nie jest zdefiniowana
IgorGanapolsky
input_var = input („Naciśnij„ E ”i„ Enter ”, aby wyjść:”) NameError: nazwa „e” nie jest zdefiniowana Używam Pythona 2.5. Jak mogę pokonać ten błąd.
Deepak Dubey
Możesz uniknąć powiadomienia o śledzeniu, używając następującego importu dostarczonego z Pythonem 2.7:import fileinput result=[] for line in fileinput.input(): result.append(line)
Stefan Gruenwald
Oto więcej historii i uzasadnienia: python.org/dev/peps/pep-3111
Julian
33

Najlepszym sposobem przetwarzania argumentów wiersza poleceń jest argparsemoduł.

Służy raw_input()do uzyskiwania informacji od użytkownika. Jeśli zaimportujesz, readline moduleużytkownicy będą mieli edytowanie linii i historię.

Dave Webb
źródło
readline jest dostępny tylko w systemie Unix po wyjęciu z pudełka.
szalony jeż
5
argparse jest nową opcją
Niels Bom
18

Ostrożnie nie używaj tej inputfunkcji, chyba że wiesz, co robisz. W przeciwieństwie do raw_input, inputakceptuje dowolne wyrażenie w języku Python, więc jest trochę podobneeval

Vhaerun
źródło
15

Ten prosty program pomaga zrozumieć, w jaki sposób karmić dane wejściowe użytkownika z wiersza poleceń i pokazać pomoc w przekazywaniu nieprawidłowych argumentów.

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) Aby znaleźć pierwiastek kwadratowy z 5

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

2) Podanie nieprawidłowego argumentu innego niż liczba

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
źródło
10

Użyj „raw_input” do wprowadzania danych z konsoli / terminala.

jeśli chcesz tylko argumentu wiersza poleceń, takiego jak nazwa pliku lub coś np

$ python my_prog.py file_name.txt

możesz użyć sys.argv ...

import sys
print sys.argv

sys.argv jest listą, gdzie 0 jest nazwą programu, więc w powyższym przykładzie sys.argv [1] to „nazwa_pliku.txt”

Jeśli chcesz mieć pełne opcje wiersza poleceń, użyj modułu optparse.

Pev

Simon Peverett
źródło
9

Jeśli używasz Pythona <2.7, potrzebujesz optparse , który, jak wyjaśnia dokument, stworzy interfejs do argumentów wiersza poleceń, które są wywoływane podczas uruchamiania aplikacji.

Jednak w Pythonie ≥2.7 optparse zostało przestarzałe i zostało zastąpione przez argparse, jak pokazano powyżej. Szybki przykład z dokumentów ...

Poniższy kod jest programem w języku Python, który pobiera listę liczb całkowitych i generuje sumę lub maksimum:

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
źródło
6

Jeśli jest to wersja 3.x, po prostu użyj:

variantname = input()

Na przykład, chcesz wprowadzić 8:

x = input()
8

x będzie równe 8, ale będzie to ciąg znaków, chyba że zdefiniujesz inaczej.

Możesz więc użyć polecenia konwersji, takiego jak:

a = int(x) * 1.1343
print(round(a, 2)) # '9.07'
9.07
CorpseDead
źródło
3

W Python 2:

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

W Pythonie 3:

data = input('Enter something: ')
print(data)
znak
źródło
2
import six

if six.PY2:
    input = raw_input

print(input("What's your name? "))
Will Charlton
źródło