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
.