¿Cómo se puede usar el argparse de python con una cadena de argumento predefinida?

Quiero usar el módulo argparse de pythons para analizar mi cadena de parámetros cli. Esto funciona para los parámetros un pase desde el terminal, pero no con una cadena dada.

import argparse parser = argparse.ArgumentParser(description='Argparse Test script') parser.add_argument("param", help='some parameter') argString = 'someTestFile' print(argString) args = parser.parse_args(argString) 

Si ejecuto este script obtengo esta salida:

 ~/someTestFile usage: argparsetest.py [-h] param argparsetest.py: error: unrecognized arguments: ome T est F ile 

El ~/someTestFile se transforma de alguna manera en un ~/someTestFile . Como ya se mencionó, funciona si paso el nombre de archivo del terminal.

Podría imaginar, que esto tiene algo que ver con las codificaciones de cadenas. ¿Alguien tiene una idea de cómo solucionar esto?

Ah, no, no, no. parser.parse_args() espera una secuencia en la misma forma que sys.argv[1:] . Si trata una cadena como una secuencia sys.argv, obtiene ['s', 'o', 'm', 'e', 'T', 'e', 's', 't', 'F', 'i', 'l', 'e'] . ‘s’ se convierte en el argumento relevante, y luego el rest de la cadena no se puede analizar.

En su lugar, es probable que desee pasar parser.parse_args(['someTestFile'])

Otra opción es usar shlex.split . Es especialmente conveniente si tiene una cadena de argumentos CLI real:

 import shlex argString = '-vvvv -c "yes" --foo bar --some_flag' args = parser.parse_args(shlex.split(argString)) 

Al igual que el sys.argv predeterminado es una lista, sus argumentos también deben ser una lista.

 args = parser.parse_args([argString]) 

Simplemente split tu cadena de comando:

 args = parser.parse_args(argString.split()) 

Un ejemplo completo para mostrar:

 import argparse if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('--dummy_opt', nargs='*', type=int, help='some ids') argString = "--dummy_opt 128 128" args = parser.parse_args(argString.split()) print(args) 

saldrá:

Namespace(pic_resize=[128, 128])