¿Cómo accedo a los argumentos de la línea de comandos en Python?


362

Uso python para crear la configuración de mi proyecto, pero necesito ayuda para obtener los argumentos de la línea de comandos.

Intenté esto en la terminal:

$python myfile.py var1 var2 var3

En mi archivo Python, quiero usar todas las variables que son de entrada.


1
El módulo Baker es una gran herramienta para escribir aplicaciones de línea de comandos de Python. pypi.python.org/pypi/Baker/1.02
Spike Gronim

Respuestas:



116
import sys

sys.argv[1:]

le dará una lista de argumentos (sin incluir el nombre del archivo python)


55
Que [1:]significa
Kolob Canyon

8
@KolobCanyon significa "tomar una sublista desde el índice 1 hasta el final", es decir, omitir el primer elemento
Kamil Jarosz,

@KolobCanyon toma el segundo argumento [1:]hacia arriba porque el primer argumento de sys.argves, por defecto, el nombre del archivo python que está ejecutando, por ejemplo testrun.py.
Samuel Nde

95

Recomiendo altamente lo argparseque viene con Python 2.7 y versiones posteriores.

El argparsemódulo reduce el código de la placa de la caldera y hace que su código sea más robusto, porque el módulo maneja todos los casos de uso estándar (incluidos los subcomandos), genera la ayuda y el uso para usted, verifica y desinfecta la entrada del usuario, todo lo que debe preocupar cuando Están utilizando el sys.argvenfoque. Y es gratis (incorporado).

Aquí un pequeño ejemplo:

import argparse

parser = argparse.ArgumentParser("simple_example")
parser.add_argument("counter", help="An integer will be increased by 1 and printed.", type=int)
args = parser.parse_args()
print(args.counter + 1)

y la salida para python prog.py -h

usage: simple_example [-h] counter

positional arguments:
  counter     counter will be increased by 1 and printed.

optional arguments:
  -h, --help  show this help message and exit

y python prog.py 1como es de esperar:

2

77
Respuesta de calidad, no estoy seguro de por qué alguien aquí usaría cualquiera de los otros enfoques dados aquí. ¡Especialmente porque está integrado! ¿No tienen mejores cosas que hacer que analizar?
Bassinator

Solo para mencionar cómo debe acceder al argumento específico en el espacio de nombres args: args.counter
MikeL

1
@Bassinator En los casos en que no se necesita analizar los argumentos.
reducción de la actividad

para usar el valor predeterminado, sin un valor específico en la línea de comando, puede usar algo como: parser.add_argument('var3', nargs='?', type=int, default=3)var3 es un parámetro opcional, si no especifica un valor en la línea de comando puede acceder a var3 en su código, valor predeterminado para var3 = 3
Albicocco

56

Código de Python:

import sys

# main
param_1= sys.argv[1] 
param_2= sys.argv[2] 
param_3= sys.argv[3]  
print 'Params=', param_1, param_2, param_3

Invocación:

$python myfile.py var1 var2 var3

Salida:

Params= var1 var2 var3 

24

Puede usar sys.argvpara obtener los argumentos como una lista.

Si necesita acceder a elementos individuales, puede usar

sys.argv[i]  

donde iestá index, 0le dará el nombre de archivo python que se está ejecutando. Cualquier índice después de eso son los argumentos pasados.


6

Si lo llamas así: $ python myfile.py var1 var2 var3

import sys

var1 = sys.argv[1]
var2 = sys.argv[2]
var3 = sys.argv[3]

Similar a las matrices que también tiene, sys.argv[0]que siempre es el directorio de trabajo actual.


66
sys.argv[0]no es el directorio de trabajo actual. Es el nombre del archivo que se está ejecutando.
mira el

5

Algunas cosas adicionales que se me ocurren.

Como @allsyed dijo, sys.argv proporciona una lista de componentes (incluido el nombre del programa), por lo que si desea conocer la cantidad de elementos que se pasan a través de la línea de comando, puede usar len () para determinarlo. En base a esto, puede diseñar mensajes de excepción / error si el usuario no pasó un número específico de parámetros.

Además, si está buscando una mejor manera de manejar los argumentos de la línea de comandos, le sugiero que consulte https://docs.python.org/2/howto/argparse.html

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.