Cambio de patada
Actualmente me estoy enseñando a mí mismo Python y me preguntaba (en referencia a mi ejemplo a continuación) en términos simplificados cuál es el 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()
Es posible que haya sido dirigido aquí porque estaba preguntando sobre un IndexError
en tu código que usa sys.argv
. El problema es no en tu código; el problema es que tienes que correr el programa de una manera que hace sys.argv
contienen los valores correctos. Por favor, lea las respuestas para entender cómo sys.argv
obras.
Si leyó y entendió las respuestas y aún tiene problemas en Windows, verifique si Python Script no toma sys.argv en Windows soluciona el problema. Si está intentando ejecutar el programa desde dentro de un IDEes posible que necesite ayuda específica de IDE; busque, pero primero verifique si puede ejecutar el programa correctamente desde la línea de comandos.
Jason R. Coombs
Me gustaría señalar que las respuestas anteriores hicieron muchas suposiciones sobre el conocimiento del usuario. Esta respuesta intenta responder la pregunta a un nivel más tutorial.
Por 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 de la Convención de programación C en el que argv y argc representan los argumentos de la línea de comandos.
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.
Simplemente puede crear un script que imprima los argumentos tal como están representados. También imprime el número de argumentos, usando el len
funció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 llamas 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 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, 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 números enteros basados en cero, puede obtener los elementos individuales utilizando la lista[0] sintaxis. Por ejemplo, para obtener el nombre del script:
script_name = sys.argv[0] # this will always work.
Aunque es interesante, rara vez necesita saber el nombre de su script. Para obtener el primer argumento después de la secuencia de comandos 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 parte 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 la línea de comandos (como un string
) proporcionado al script en cuestión. No solicitará entrada, pero fallará con un IndexError si no se proporcionan argumentos en la línea de comandos después del nombre del script.
-
Cuando muestras la lista de cadenas
sys.argv
me pregunto cuál es la líneafrom __future__ import print_function
hace. ¿Es algo que debo agregar si soy NO ejecutándose en Python 3 pero Python 2? @Jason R. Coombs– Nicolás
28 de junio de 2016 a las 8:42
-
@NicholasLiu, no necesita agregarlo si está en Python 3. Lo agregué para completar. Intente ejecutar sin él en Python 2 y obtendrá resultados diferentes a los que describí. Darle una oportunidad.
– Jason R. Coombs
10 de julio de 2016 a las 1:02
-
@ JasonR.Coombs Estoy confundido con este:
sys.argv **is** automatically a list of strings
. ¿Quieres decir “da” o “devuelve”?– JinSnow
20 de febrero de 2017 a las 20:51
-
@Guillaume: es una diferencia semántica sutil, pero en Python, nombres como sys.argv contienen referencias a objetos. Así que técnicamente, el
argv
atributo de lasys
módulo es una referencia a un objeto de lista que contiene las cadenas de los argumentos. Usargives
oreturns
sugeriría una invocación de función o un generador u otra construcción.references
orepresents
podrían ser términos más precisos, perois
está lo suficientemente cerca.– Jason R. Coombs
21 de febrero de 2017 a las 22:55
-
@JasonR.Coombs ¿Qué sucede si llamo directamente?
main
importando el módulo (digamos que el nombre del módulo esmoduleA.py
) y llamar a la función como enimport moduleA; moduleA.main()
. En ese caso, no hay argumentos de línea de comandos… también lo essys.argv[0]
todavía se supone que representa elfilename
es decir. debería imprimirmoduleA.py
?– alfa_989
1 de agosto de 2018 a las 17:02
Frederic Hamidi
sys.argv[1] contiene el primero línea de comando argumento pasado a su script.
Por ejemplo, si su script se llama hello.py
y emites:
$ python3.1 hello.py foo
o:
$ chmod +x hello.py # make script executable
$ ./hello.py foo
Su script imprimirá:
Hello there foo
-
Tengo que ejecutar este comando: exec py C:\\project-open\\servers\\projop\\packages\\intranet-timesheet2\\www\\hours\\y.py ¿Hay alguna manera de usar la ruta relativa para el archivo python?
– prohibidoDeHacerPreguntas
9 de febrero de 2020 a las 11:36
usuario2205939
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’, ‘something’]
En este caso sys.argv[1] = 'something'
Solo agregando 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”.
Raúl
Agregando algunos puntos más a la respuesta de Jason:
Para tomar todos los argumentos proporcionados por el usuario: user_args = sys.argv[1:]
Considera el sys.argv
como una lista de cadenas como (mencionado por Jason). Así que todas las manipulaciones de la lista se aplicarán aquí. Esto se llama “Rebanado de lista”. Para más información visita aquí.
La sintaxis es así: 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 solo desea tomar todos los argumentos después del tercer argumento, entonces:
user_args = sys.argv[3:]
Supongamos que solo quiere los dos primeros argumentos, entonces:
user_args = sys.argv[0:2] or user_args = sys.argv[:2]
Suponga que desea los argumentos 2 a 4:
user_args = sys.argv[2:4]
Supongamos que desea el último argumento (el último argumento siempre es -1, por lo que lo que está sucediendo aquí es que comenzamos el conteo desde atrás. Entonces, el inicio es el último, sin final, sin paso):
user_args = sys.argv[-1]
Supongamos que desea el penúltimo argumento:
user_args = sys.argv[-2]
Supongamos que desea los dos últimos argumentos:
user_args = sys.argv[-2:]
Suponga que quiere los dos últimos argumentos. Aquí, el inicio es -2, que es el penúltimo elemento y luego hasta el final (indicado por :
):
user_args = sys.argv[-2:]
Suponga que desea todo excepto los dos últimos argumentos. Aquí, el inicio es 0 (por defecto) y el final es el penúltimo elemento:
user_args = sys.argv[:-2]
Suponga que desea los argumentos en orden inverso:
user_args = sys.argv[::-1]
TartánLlama
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 miembros siguientes son argumentos.
Carlos Knechtel
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 – test1.jpg, argumento 2 – test2.jpg
Con el script create_thumbnail.py que uso
sys.argv[1:]
que me da la lista de argumentos que pasé en la línea de comando como
['test1.jpg', 'test2.jpg']
Esto, no es parte de la pregunta, y es muy antiguo pero el modulo análisis de argumentosprobablemente sea mejor para lo que estás tratando de hacer, de acuerdo con esto
– llrs
4 de abril de 2014 a las 13:14