2010-11-07 31 views
74

Actualmente me estoy enseñando Python y me preguntaba (en referencia a mi ejemplo a continuación) en términos simplificados qué representa sys.argv [1]. ¿Simplemente está pidiendo una entrada?sys.argv [1] significado en script

#!/usr/bin/python3.1 

# import modules used here -- sys is a very standard one 
import sys 

# Gather our code in a main() function 
def main(): 
    print ('Hello there', sys.argv[1]) 
    # Command line args are in sys.argv[1], sys.argv[2] .. 
    # sys.argv[0] is the script name itself and can be ignored 

# Standard boilerplate to call the main() function to begin 
# the program. 
if __name__ == '__main__': 
    main() 
+0

Esto, no es parte de la pregunta, y es muy antiguo, pero el módulo [argparse] (https://docs.python.org/2/library/argparse.html#module-argparse), probablemente sea mejor por lo que estás tratando de hacer, de acuerdo con [esto] (http://stackoverflow.com/q/1009860/2886003) – Llopis

Respuesta

212

Me gustaría señalar que las respuestas anteriores hicieron muchas suposiciones sobre el conocimiento del usuario. Esta respuesta intenta responder a la pregunta a un nivel más tutorial.

Para cada invocación de Python, sys.argv es automáticamente una lista de cadenas que representan los argumentos (separados por espacios) en la línea de comandos. El nombre proviene del C programming convention en el que argv y argc representan los argumentos de la línea de comando.

Querrá aprender más sobre listas y cadenas a medida que se familiarice con Python, pero mientras tanto, aquí hay algunas cosas que debe saber.

Puede simplemente crear un script que imprima los argumentos tal como están representados. También imprime la cantidad de argumentos, usando la función len en la lista.

from __future__ import print_function 
import sys 
print(sys.argv, len(sys.argv)) 

El script requiere Python 2.6 o posterior. Si llama a este script print_args.py, puede invocarlo con diferentes argumentos para ver qué sucede.

> python print_args.py 
['print_args.py'] 1 

> python print_args.py foo and bar 
['print_args.py', 'foo', 'and', 'bar'] 4 

> python print_args.py "foo and bar" 
['print_args.py', 'foo and bar'] 2 

> python print_args.py "foo and bar" and baz 
['print_args.py', 'foo and bar', 'and', 'baz'] 4 

Como se puede ver, los argumentos de línea de comandos incluyen el nombre del script, pero no el nombre del intérprete. En este sentido, Python trata el script como el ejecutable. Si necesita saber el nombre del ejecutable (python en este caso), puede usar sys.executable.

Puede ver en los ejemplos que es posible recibir argumentos que contienen espacios si el usuario invocó el script con argumentos encapsulados entre comillas, de modo que lo que obtiene es la lista de argumentos proporcionada por el usuario.

Ahora en su código de Python, puede usar esta lista de cadenas como entrada para su programa. Como las listas están indexadas por enteros basados ​​en cero, puede obtener los elementos individuales usando la sintaxis de la lista [0]. Por ejemplo, para obtener el nombre del script:

script_name = sys.argv[0] # this will always work. 

Aunque eso es interesante saber, que rara vez se necesita saber su nombre del script. Para obtener el primer argumento después de que el guión de un nombre de archivo, se puede hacer lo siguiente:

filename = sys.argv[1] 

Este es un uso muy común, pero tenga en cuenta que se producirá un error con un IndexError si hay argumento fue suministrado.

Además, Python permite hacer referencia a una porción de una lista, así que para obtener otra lista de sólo los argumentos proporcionados por el usuario (pero sin el nombre del script), que puede hacer

user_args = sys.argv[1:] # get everything after the script name 

Además, Python le permite asignar una secuencia de elementos (incluidas listas) a nombres de variables. Así que si usted espera que el usuario suministre siempre dos argumentos, puede asignar esos argumentos (cadenas) a dos variables:

user_args = sys.argv[1:] 
fun, games = user_args # len(user_args) had better be 2 

Así, en respuesta definitiva a su problema, sys.argv[1] representa el primer argumento de línea de comandos (como string) suministrado al script en cuestión. No solicitará la entrada, pero fallará con un IndexError si no se proporcionan argumentos en la línea de comandos siguiendo el nombre del script.

+0

Cuando se muestra la lista de cadenas 'sys.argv', me pregunto cuál es la línea' desde __future__ import print_function' hace. ¿Es algo que debo agregar si estoy ** NO ** corriendo en Python 3 pero Python 2? @Jason R. Coombs – Nicholas

+1

@NicholasLiu, no necesita agregarlo si está en Python 3. Lo agregué para completarlo. Intenta correr sin él en Python 2 y obtendrás resultados diferentes a los que describí. Darle una oportunidad. –

+0

@ JasonR.Coombs Confundo con este: 'sys.argv ** es ** automáticamente una lista de cadenas'. ¿Quieres decir "da" o "regresa"? – JinSnow

26

sys.argv[1] contiene la primera command lineargument pasado a su script.

Por ejemplo, si el script se llama hello.py y emitir:

$ python3.1 hello.py foo

o:

$ chmod +x hello.py # make script executable 
$ ./hello.py foo 

Su script imprimirá:

Hello there foo
3

sys.argv es una lista que contiene la ruta del script y los argumentos de la línea de comando; es decir, sys.argv [0] es la ruta del script que está ejecutando y todos los miembros siguientes son argumentos.

10

sólo añadir a la respuesta de Frederic, por ejemplo, si se llama a la secuencia de comandos de la siguiente manera:

./myscript.py foo bar

sys.argv[0] habría "./myscript.py" sys.argv[1] habría "foo" y sys.argv[2] haría ser "barra" ... y así sucesivamente.

En su código de ejemplo, si llama al script de la siguiente manera ./myscript.py foo, la salida del script será "Hello there foo".

13

sys.argv es una lista.

Esta lista es creada por su línea de comandos, es una lista de sus argumentos de línea de comando.

Por ejemplo:

en su línea de comando que introduzca algo como esto,

python3.2 file.py something 

sys.argv se convertirá en una lista [ 'file.py', 'algo']

En este case sys.argv[1] = 'something'

6

Agregando algunos puntos más a la respuesta de Jason:

Para tomar todos los argumentos proporcionados por el usuario: user_args = sys.argv[1:]

Considere el sys.argv como una lista de cadenas como (mencionado por Jason). Entonces todas las manipulaciones de la lista se aplicarán aquí. Esto se llama "List Slicing". Para obtener más información, visite here.

La sintaxis es la siguiente: list [start: end: step]. Si omite el inicio, el valor predeterminado será 0, y si omite el final, el valor predeterminado será la longitud de la lista.

Supongamos que sólo desea tener todos los argumentos después de la tercera argumento, entonces:

user_args = sys.argv[3:] 

Supongamos solo deseas los dos primeros argumentos, entonces:

user_args = sys.argv[0:2] or user_args = sys.argv[:2] 

Suponga que desea argumentos 2 a 4:

user_args = sys.argv[2:4] 

Supongamos que quiere el último argumento (el último argumento es siempre -1, Entonces, ¿qué está pasando aquí? Comenzamos la cuenta desde atrás. Así que empieza es pasado, no tiene fin, hay un paso):

user_args = sys.argv[-1] 

Suponga que desea el segundo último argumento:

user_args = sys.argv[-2] 

Supongamos que desea que los dos últimos argumentos:

user_args = sys.argv[-2:] 

Suponga quieres los dos últimos argumentos Aquí, el inicio es -2, que es penúltimo elemento y luego hasta el final (denotado por ":"):

user_args = sys.argv[-2:] 

Supongamos que desea que el todo excepto últimos dos argumentos. Aquí, inicial es 0 (por defecto), y al final es el segundo elemento última:

user_args = sys.argv[:-2] 

Supongamos que desea que los argumentos en orden inverso:

user_args = sys.argv[::-1] 

Espero que esto ayude.

2

para pasar argumentos a su script Python mientras se ejecuta una secuencia de comandos a través de línea de comandos

pitón create_thumbnail.py test1.jpg test2.jpg

aquí, el nombre guión - create_thumbnail.py, argumento 1 - test1.jpg, argumento 2 - test2.jpg

Con el guión en create_thumbnail.py yo uso

sys.argv[1:] 

que me dan la lista de argumentos pasé en la línea de comandos como [ 'test1.jpg', 'test2.jpg']

0

sys .argv mostrará los argumentos de línea de comando pasados ​​al ejecutar un script o puede decir que sys.argv almacenará los argumentos de línea de comando pasados ​​en python mientras se ejecuta desde el terminal.

Intenta esto:

import sys 
print sys.argv 

almacena argv todos los argumentos que se pasan en una lista pitón.Lo anterior imprimirá todos los argumentos pasados ​​ejecutando el script.

Ahora probar este funcionamiento de su filename.py así:

python filename.py example example1 

Esto imprimirá 3 argumentos en una lista.

sys.argv[0] #is the first argument passed, which is basically the filename. 

Del mismo modo, argv 1 es el primer argumento pasado, en este caso 'ejemplo'

Una pregunta similar se ha pedido ya here por cierto. ¡Espero que esto ayude!

Cuestiones relacionadas