2012-02-26 16 views
6

sto imparando dal codice, e mi si confondono con una delle sue linee che è:Che cosa significa "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 

Ho cercato on-line e cercato di capire cosa sys.arg mezzi, e qui è la mia comprensione:

Quindi sys.argv[0] è il nome del file e sys.argv[1:] è il resto dei parametri che dovrebbero essere forniti dagli utenti. Non sono sicuro io ho capito bene, e se lo è, allora non capisco il motivo per cui non posso che essere come:

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

Qual è la differenza tra questi due modi di dare parametri?

Inoltre, se corro il codice (premere F5 ), la shell Python mi danno un errore del tipo:

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 

non ero nemmeno data la possibilità di dare i parametri (sys.argv[1:]) prima che mi ha dato un errore Così ho cercato online. Sembra che ho bisogno di eseguire questo codice in cmd che mi ha confuso di più, perché dovrebbe e come dovrei inserirlo in cmd per eseguirlo?

risposta

6

La differenza è, che sys.argv (riga di comando) i parametri sono dati prima che il programma è in esecuzione (durante l'avvio di esso):

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

Questo comporterebbe le variabili di essere:

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

Mentre i input() s vengono dati quando il programma è in esecuzione.

Poiché non si avvia il programma con i parametri, viene generato l'errore, perché non ci sono abbastanza (esattamente 0) parametri da decomprimere nelle variabili.

+0

ah! ok, ho capito. grazie! – user1233157

1

I parametri non corrispondono all'immissione del programma. Ad esempio, ecco wget utilizzato con i parametri:

$ wget "I am a parameter!" 

Ecco cat usato con ingresso:

$ cat 
Now you type. This is the input. 

questo è il motivo per il vostro errore, anche - non è possibile specificare i parametri come ad esempio dopo aver eseguito il programma.

2

sys.argv sono chiamati "parametri della riga di comando". Se vuoi passarli, devi eseguire lo script da una riga di comando. Su un sistema Windows il comando sarà simile:

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

dove "cmd>" è il prompt che si ottiene dopo aver usato "Start" -> "Esegui".

2

Tutte le altre risposte spiegate sys.argv vanno bene, ma penso che ci fosse un pezzo di terminologia fondamentale che mancava. Volevo solo aggiungere che ...

input() indica al programma di leggere da stdin.

È come leggere da un file ed è uno stream. La chiamata input() viene letta finché non viene raggiunta una nuova riga. È anche possibile leggere stdin fino a quando viene raggiunto un EOF (end of file).

sys.argv d'altra parte è semplicemente un elenco reso disponibile dal sistema che contiene tutti gli argomenti che sono stati utilizzati per chiamare il comando dalla shell. Tecnicamente esiste un tipo di limite (da sistema per sistema) a maximum number of arguments that can be passed on the command line, motivo per cui esiste il comando xargs (per chiamare il comando con batch di argomenti, divisi).

stdin

echo "I am stdin" | myCommand.py

... Che è lo stesso concetto sotto il cofano come fare questo dopo che il programma è in esecuzione:

read_from_stdin = input()

args

myCommand.py "I am an arg"

Infine, la lettura da stdin/input() non divide automaticamente le parole in un elenco. Esistono metodi aggiuntivi per la lettura per riga che è possibile utilizzare. Ma puoi anche leggere per carattere, una quantità specifica di caratteri alla volta o l'intera quantità di dati contemporaneamente.

+0

'input()' legge una riga, non prima di EOF. – kindall

+0

@kindall - Grazie per la correzione! Ho modificato quella linea. – jdi