Saltar al contenido

Python: ¿Cómo puedo habilitar el uso de kwargs cuando llamo desde la línea de comandos? (quizás con argparse)

Hola usuario de nuestro sitio web, hallamos la solución a lo que andabas buscando, continúa leyendo y la verás un poco más abajo.

Solución:

@Moon se me adelantó con una solución similar, pero sugeriría hacer el análisis de antemano y pasar en real kwargs:

import sys

def main(foo, bar, **kwargs):
    print('Called myscript with:')
    print('foo = '.format(foo))
    print('bar = '.format(bar))
    for k, v in kwargs.items():
        print('keyword argument:  = '.format(k, v))

if __name__=='__main__':
    main(sys.argv[1], # foo
         sys.argv[2], # bar
         **dict(arg.split('=') for arg in sys.argv[3:])) # kwargs

# Example use:
# $ python myscript.py foo bar hello=world 'with spaces'='a value'
# Called myscript with:
# foo = foo
# bar = bar
# keyword argument: hello = world
# keyword argument: with spaces = a value

En primer lugar, no pasará una expresión de Python arbitraria como argumento. Es frágil e inseguro.

Para configurar el analizador de argumentos, defina los argumentos que desea, luego analícelos para producir un Namespace objeto que contiene la información especificada por la llamada de línea de comando.

import argparse
p = argparse.ArgumentParser()
p.add_argument('foo')
p.add_argument('bar')
p.add_argument('--add-feature-a', dest='a', action='store_true', default=False)

En tus __main__ bloque, analizará los argumentos, luego pasará un diccionario producido a partir del Namespace a main.

if __name__ == '__main__':
    args = p.parse_args()
    main(**vars(args))

Luego llamarás a tu script con una línea como

# foo = "3", bar = "6", a = True
python myscript.py 3 6 --add-feature-a

o

# foo = "moo", bar="7.7", a = False
python myscript.py moo 7.7

Hay mucho más que puedes hacer con argparse, pero este es un ejemplo simple para obtener el valor que produce en main.

Si desea pasar argumentos de palabras clave como lo haría en la función principal, key=value, puedes hacerlo así:

import sys

def main(foo, bar, *args):
    print "Called my script with"

    print "foo = %s" % foo
    print "bar = %s" % bar

    for arg in args:
        k = arg.split("=")[0]
        v = arg.split("=")[1]

        print "Keyword argument: %s = %s" % (k, v)


if __name__ == "__main__":
    if len(sys.argv) < 3:
        raise SyntaxError("Insufficient arguments.")
    if len(sys.argv) != 3:
        # If there are keyword arguments
        main(sys.argv[1], sys.argv[2], *sys.argv[3:])
    else:
        # If there are no keyword arguments
        main(sys.argv[1], sys.argv[2])

Algunos ejemplos:

$> python my_file.py a b x=4
Called my script with
foo = a
bar = b
Keyword argument: x = 4
$> python my_file.py foo bar key=value
Called my script with
foo = foo
bar = bar
Keyword argument: key = value

Sin embargo, esto supone que el key y el valor no tienen ningún espacio en blanco entre ellos, key = value no trabajará.

Si usted está buscando --argument tipos de argumentos de palabras clave, usted deberían usar argparse.

Reseñas y calificaciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *