¿Cómo puedo utilizar argparse de Python con una cadena de argumentos predefinida?

StackOverflow https://stackoverflow.com/questions/8878478

  •  28-10-2019
  •  | 
  •  

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?

¿Fue útil?

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])

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top