¿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.

ParisNakitaKejser
fuente
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:

503

El tutorial de Python lo explica :

import sys

print(sys.argv)

Más específicamente, si ejecuta python example.py one two three:

>>> import sys
>>> print(sys.argv)
['example.py', 'one', 'two', 'three']
SilentGhost
fuente
77
¿Tanques, pero ahora necesito usar mi var1? qué pasa aquí .. :)
ParisNakitaKejser
102
Dooh, lo tengo (sys.argv [1]): D
ParisNakitaKejser
116
import sys

sys.argv[1:]

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

Ryan M
fuente
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
Michael Dorner
fuente
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 
Charles P.
fuente
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.

allsyed
fuente
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.

lvadim01
fuente
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

Rohan Sadale
fuente