2012-02-26 10 views
6

estoy aprendiendo de código, y estoy confundirse con una de sus líneas, que es:¿Qué 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 

He buscado en línea y trató de entender lo que sys.arg medios, y aquí es mi entendimiento:

Entonces, sys.argv[0] es el nombre del archivo y sys.argv[1:] es el resto de los parámetros que deben dar los usuarios. No estoy seguro soy yo lo entendía bien, y si lo es, entonces no entiendo por qué no puedo ser como él:

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

¿Cuál es la diferencia entre estas dos formas de administrar los parámetros?

Además, si corro el código (presione F5 ), el terminal de Python dame un error como:

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 

ni siquiera me dieron la oportunidad de dar parámetros (sys.argv[1:]) antes de que se me dio un error Entonces busqué en línea. Parece que necesito ejecutar este código en cmd, lo que me confundió más, ¿por qué debería hacerlo y cómo debería ponerlo en cmd para poder ejecutarlo?

Respuesta

6

La diferencia es, que sys.argv (línea de comandos) parámetros se dan antes de que el programa se está ejecutando (durante el arranque): I

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

Esto resultaría en sus variables son:

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

Mientras que los input() s se dan cuando el programa se está ejecutando.

Como no inicia el programa con los parámetros, le da el error porque no hay suficientes parámetros (exactamente 0) para desempaquetar en las variables.

+0

¡ah! de acuerdo, lo tengo. gracias! – user1233157

1

Los parámetros no son lo mismo que la entrada del programa. Por ejemplo, aquí está wget utilizado con los parámetros:

$ wget "I am a parameter!" 

Aquí está cat usarse con la entrada:

$ cat 
Now you type. This is the input. 

Esa es la razón de su error, también - no se puede especificar los parámetros como por ejemplo después de ejecutar el programa.

2

sys.argv se llaman "parámetros de línea de comando". Si desea pasarlos, debe ejecutar el script desde una línea de comando. En un sistema Windows el comando se vería así:

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

donde "cmd>" es el símbolo se obtiene después de usar "Inicio" -> "Ejecutar".

2

Todas las demás respuestas explicaron sys.argv bien, pero creo que faltaba una terminología fundamental. Solo quería agregar que ...

input() le dice a su programa que lea stdin.

Es como leer de un archivo y es una secuencia. La llamada input() lee hasta que se llegue a una nueva línea. También puede leer stdin hasta que se alcance un EOF (end of file).

sys.argv por el contrario, es simplemente una lista que está disponible para usted desde el sistema que contiene todos los argumentos que se utilizaron para llamar al comando desde el shell. Técnicamente existe algún tipo de límite (sistema por sistema) para el maximum number of arguments that can be passed on the command line, por lo que existe el comando xargs (para llamar a su comando con lotes de sus argumentos, divídalo).

entrada estándar

echo "I am stdin" | myCommand.py

... ¿Cuál es el mismo concepto bajo el capó como hacer esto después de su programa se está ejecutando:

read_from_stdin = input()

args

myCommand.py "I am an arg"

Y, por último, la lectura de stdin/input() no dividirá automáticamente sus palabras en una lista. Hay métodos adicionales para leer por línea que puede usar. Pero también puede leer por personaje, una cantidad específica de caracteres a la vez o toda la cantidad de datos a la vez.

+0

'input()' lee una línea, no hasta EOF. – kindall

+0

@kindall - ¡Gracias por la corrección! Edité esa línea. – jdi