¿Cómo puedo utilizar argparse de Python con una cadena de argumentos predefinida?
Pregunta
Quiero usar el módulo argparse de Pythons para analizar la cadena de parámetros de mi CLI.Esto funciona para los parámetros que se pasan desde la terminal, pero no con una cadena determinada.
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 este resultado:
~/someTestFile
usage: argparsetest.py [-h] param
argparsetest.py: error: unrecognized arguments: o m e T e s t F i l e
El ~/someTestFile
de alguna manera se transforma en o m e T e s t F i l e
.Como ya se mencionó, funciona si paso el nombre del archivo desde la terminal.
Me imagino que esto tiene algo que ver con las codificaciones de cadenas.¿Alguien tiene una idea de cómo solucionar este problema?
Solución
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 resto de la cadena no se puede analizar.
En su lugar, probablemente desee pasar parser.parse_args(['someTestFile'])
Otros consejos
Otra opción es usar shlex.split .Es especialmente muy 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 valor predeterminado sys.argv
es una lista, sus argumentos también deben ser una lista.
args = parser.parse_args([argString])
Simplemente split
su 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)
dará como resultado:
Namespace(pic_resize=[128, 128])