2012-02-26 11 views
6

uczę się z kodu, a ja się mylić przez jednego z jego wierszy, które jest:Co oznacza "sys.argv"?

things = [float(arg) for arg in sys.argv[1:]] 
Omega_a, Omega_b, Delta_a, Delta_b, \ 
init_pop_a, init_pop_b, tstep, tfinal = things 

Szukałem w Internecie i starał się zrozumieć, co sys.arg środki, i tu jest moje rozumienie:

Tak więc sys.argv[0] to nazwa pliku, a sys.argv[1:] to pozostałe parametry, które powinny być podane przez użytkowników. Nie jestem pewien, mam rozumieć to dobrze, a jeśli tak, to ja nie rozumiem, dlaczego nie mogę być tak:

Omega_a = input() 
Omega_b = input() 
etc... 

Jaka jest różnica między tymi dwoma sposobami podając parametry?

Ponadto, jeśli uruchomić kod (naciśnij F5), powłoka Pythona dać mi błąd jak:

Traceback (most recent call last): 

File "C:\Users\testcode.py", line 55, in <module> 
init_pop_a, init_pop_b, tstep, tfinal = things 
ValueError: need more than 0 values to unpack 

nie został jeszcze szansę dać parametry (sys.argv[1:]), zanim dał mi błąd. Więc szukałem w Internecie. Wygląda na to, że muszę uruchomić ten kod w cmd, który bardziej mnie myli, dlaczego powinien i jak powinienem umieścić cmd, aby go uruchomić?

Odpowiedz

6

Różnica jest, że parametry sys.argv (wiersza poleceń) podano wcześniej program jest uruchomiony (podczas uruchamiania go):

python testcode.py arg1 arg2 arg3 arg4 and so on ... 

Spowodowałoby zmiennych są:

Omega_a = 'arg1' 
Omega_b = 'arg2' 
Delta_a = 'arg3' 
Delta_b = 'arg4' 
init_pop_a = 'and' 
init_pop_b = 'so' 
tstep = 'on' 
tfinal = '...' 

Podczas gdy input() s są podane, gdy program jest uruchomiony.

Ponieważ nie uruchamiasz programu z parametrami, pojawia się błąd, , ponieważ nie ma wystarczającej liczby (dokładnie 0) parametrów do rozpakowania w zmiennych.

+0

ah! w porządku, mam to. thanks! – user1233157

1

Parametry to nie to samo co wejście programu. Na przykład, oto wget używany z parametrami:

$ wget "I am a parameter!" 

Tutaj jest cat stosowany z wejściem:

$ cat 
Now you type. This is the input. 

To jest powód do błędu, za - nie można określić parametry jak takie po uruchomieniu program.

2

sys.argv nazywane są "parametrami wiersza polecenia". Jeśli chcesz je przekazać, powinieneś uruchomić skrypt z linii poleceń. W systemie Windows polecenie będzie wyglądać następująco:

cmd> python C:\Users\testcode.py arg1 args2 

gdzie „cmd>” jest szybka dostaniesz po użyciu „Start” -> „Uruchom”.

2

Wszystkie inne odpowiedzi wyjaśnione sys.argv w porządku, ale myślę, że nie było czegoś z podstawową terminologią, której brakowało. Chciałem tylko dodać, że ...

input() mówi programowi, aby przeczytał od stdin.

To jak czytanie z pliku i jest strumieniem. Wywołanie input() jest odczytywane aż do osiągnięcia nowej linii. Możesz także przeczytać stdin aż do osiągnięcia EOF (end of file).

sys.argv z drugiej strony jest po prostu listą, która jest dostępna dla ciebie z systemu zawierającego wszystkie argumenty, które zostały użyte do wywołania polecenia z powłoki. Technicznie istnieje pewien rodzaj limitu (dla każdego systemu) do maximum number of arguments that can be passed on the command line, dlatego istnieje polecenie xargs (aby wywołać twoje polecenie z partiami twoich argumentów, podzielić).

stdin

echo "I am stdin" | myCommand.py

... co jest samo pojęcie pod maską, jak robi to PO programu jest uruchomiony:

read_from_stdin = input()

args

myCommand.py "I am an arg"

I wreszcie, czytanie z stdin/input() nie spowoduje automatycznego podzielenia słów na listę. Istnieją dodatkowe metody czytania po linii, których możesz użyć. Ale możesz również czytać według postaci, określonej liczby znaków naraz lub całej ilości danych naraz.

+0

'input()' czyta wiersz, a nie EOF. – kindall

+0

@kindall - Dzięki za poprawkę! Edytowałem tę linię. – jdi