Significado de sys.argv [1] en script

146

Actualmente me estoy enseñando Python y me preguntaba (en referencia a mi ejemplo a continuación) en términos simplificados qué sys.argv[1]representa. ¿Es simplemente pedir una entrada?

#!/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()
Switchkick
fuente
2
Esto, no es parte de la pregunta, y es muy antiguo, pero el módulo argparse , probablemente es mejor para lo que está tratando de hacer, de acuerdo con este
LLR

Respuestas:

334

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

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

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

Simplemente puede crear un script que imprima los argumentos como están representados. También imprime el número de argumentos, usando la lenfunción 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 puede ver, los argumentos de la 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 usarlo sys.executable.

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

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

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

Aunque interesante, rara vez necesita saber el nombre de su script. Para obtener el primer argumento después del script para un nombre de archivo, puede hacer lo siguiente:

filename = sys.argv[1]

Este es un uso muy común, pero tenga en cuenta que fallará con un IndexError si no se proporcionó ningún argumento.

Además, Python le permite hacer referencia a una porción de una lista, por lo que para obtener otra lista de solo los argumentos proporcionados por el usuario (pero sin el nombre del script), 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. Entonces, si espera que el usuario proporcione siempre dos argumentos, puede asignar esos argumentos (como cadenas) a dos variables:

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

Entonces, para responder a su pregunta específica, sys.argv[1]representa el primer argumento de línea de comandos (como a 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 que sigue al nombre del script.

Jason R. Coombs
fuente
1
Cuando muestra la lista de cadenas sys.argv, me pregunto qué hace la línea from __future__ import print_function. ¿Es algo que debo agregar si NO estoy ejecutando Python 3 sino Python 2? @Jason R. Coombs
Nicholas
1
@NicholasLiu, no necesitas agregarlo si estás en Python 3. Lo agregué para completarlo. Intente ejecutarlo sin él en Python 2 y obtendrá resultados diferentes a los que describí. Darle una oportunidad.
Jason R. Coombs
@ JasonR.Coombs estoy confundir con éste: sys.argv **is** automatically a list of strings. ¿Te refieres a "da" o "devuelve"?
JinSnow
1
@Guillaume: es una sutil diferencia semántica, pero en Python, nombres como sys.argv contienen referencias a objetos. Técnicamente, el argvatributo del sysmódulo es una referencia a un objeto de lista que contiene las cadenas de los argumentos. Usar giveso returnssugerir una invocación de función o generador u otra construcción. referenceso representspueden ser términos más precisos, pero islo suficientemente cercanos.
Jason R. Coombs
@ JasonR. Combina lo que sucede si llamo directamente mainimportando el módulo (digamos que el nombre del módulo es moduleA.py) y llamo a la función como en import moduleA; moduleA.main(). En ese caso, no hay argumentos de línea de comandos ... por lo tanto, se sys.argv[0]supone que representa el filenameie. debería imprimir moduleA.py?
alpha_989
34

sys.argv [1] contiene el primer argumento de línea de comando pasado a su script.

Por ejemplo, si su script se nombra hello.pyy emite:

$ python3.1 hola.py foo

o:

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

Su guión imprimirá:

Hola foo
Frédéric Hamidi
fuente
Tengo que ejecutar este comando: exec py C: \\ project-open \\ server \\ projop \\ packages \\ intranet-timesheet2 \\ www \\ hours \\ y.py ¿Hay alguna manera de usar la ruta relativa para el archivo python?
Yaksh
25

sys.argv es una lista

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

Por ejemplo:

en su línea de comando ingresa algo como esto,

python3.2 file.py something

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

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

user2205939
fuente
12

Simplemente agregue a la respuesta de Frederic, por ejemplo, si llama a su script de la siguiente manera:

./myscript.py foo bar

sys.argv[0]sería "./myscript.py" sys.argv[1]sería "foo" y sys.argv[2]sería "bar" ... 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á "Hola, foo".

CodeWombat
fuente
9

Añadiendo algunos puntos más a la respuesta de Jason:

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

Considere 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 "corte de lista". Para más información visite aquí .

La sintaxis es así: lista [inicio: fin: paso]. 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 solo desea tomar todos los argumentos después del 3er argumento, luego:

user_args = sys.argv[3:]

Supongamos que solo desea los dos primeros argumentos, luego:

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

Supongamos que quiere argumentos 2 a 4:

user_args = sys.argv[2:4]

Supongamos que desea el último argumento (el último argumento es siempre -1, así que lo que está sucediendo aquí es que comenzamos el conteo desde atrás. Así que el comienzo es el último, sin final, sin paso):

user_args = sys.argv[-1]

Supongamos que quieres el segundo último argumento:

user_args = sys.argv[-2]

Suponga que quiere los dos últimos argumentos:

user_args = sys.argv[-2:]

Supongamos que quieres los dos últimos argumentos. Aquí, el comienzo es -2, que es el segundo último elemento y luego hasta el final (indicado por ":"):

user_args = sys.argv[-2:]

Supongamos que quiere todo excepto los dos últimos argumentos. Aquí, el inicio es 0 (por defecto), y el final es el segundo último elemento:

user_args = sys.argv[:-2]

Suponga que quiere los argumentos en orden inverso:

user_args = sys.argv[::-1]

Espero que esto ayude.

Rahul
fuente
4

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

TartánLlama
fuente
3

Para pasar argumentos a su secuencia de comandos de Python mientras ejecuta una secuencia de comandos a través de la línea de comandos

python create_thumbnail.py test1.jpg test2.jpg

aquí, nombre del script: create_thumbnail.py, argumento 1 - prueba1.jpg, argumento 2 - prueba2.jpg

Con el script create_thumbnail.py que uso

sys.argv[1:]

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

JBJ
fuente
1

sys.argvEs un atributo del sysmódulo. Dice los argumentos pasados ​​al archivo en la línea de comando. sys.argv[0]captura el directorio donde se encuentra el archivo. sys.argv[1]devuelve el primer argumento pasado en la línea de comando. Piensa como si tuviéramos un archivo example.py.

ejemplo.py

import sys # Importing the main sys module to catch the arguments
print(sys.argv[1]) # Printing the first argument

Ahora aquí en el símbolo del sistema cuando hacemos esto:

python example.py

Lanzará un error de índice en la línea 2. Porque todavía no se ha pasado ningún argumento. Puede ver la longitud de los argumentos pasados ​​por el usuario usando if len(sys.argv) >= 1: # Code. Si ejecutamos el example.py con pasar un argumento

python example.py args

Imprime:

args

¡Porque fue el primer argumento! Digamos que lo hemos convertido en un archivo ejecutable usando PyInstaller. Haríamos esto:

example argumentpassed

Imprime:

argumentpassed

Es realmente útil cuando haces un comando en la terminal. Primero verifique la longitud de los argumentos. Si no se pasan argumentos, haga el texto de ayuda.

Jaidee
fuente
0

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

Solo intenta esto:

import sys
print sys.argv

argv almacena todos los argumentos pasados ​​en una lista de python. Lo anterior imprimirá todos los argumentos pasados ​​ejecutarán el script.

Ahora intente esto ejecutando 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 ya se ha hecho aquí por cierto. ¡Espero que esto ayude!

geekidharsh
fuente