2012-01-16 20 views
9

Quiero usar el módulo pythons argparse para analizar mi cadena de parámetros cli. Esto funciona para los parámetros un pase de la terminal, pero no con una cadena dada.¿Cómo se puede usar el argparse de Python con una cadena de argumento predefinida?

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 me quedo este guión me sale esta salida:

~/someTestFile 
usage: argparsetest.py [-h] param 
argparsetest.py: error: unrecognized arguments: o m e T e s t F i l e 

El ~/someTestFile es de alguna manera transformó en o m e T e s t F i l e. Como ya se mencionó, funciona si paso el nombre de 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 esto?

+0

es posible que desee echar un vistazo a la [documentación de argparse] (http://docs.python.org/library/argparse.html#parsing-arguments). –

Respuesta

19

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 leer.

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

+0

Gracias! Eso fue todo…! – thorink

4

Al igual que el defecto sys.argv es una lista, sus argumentos tienen que ser una lista así.

args = parser.parse_args([argString]) 
16

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

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

¡Gracias! Esto es muy útil. ¡Ahora puedo ejecutar desde la línea de comandos y desde otros scripts de Python! – Sudhi

+0

Alguien por favor dale a este hombre una galleta –

0

Simplemente split su cadena de comandos:

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) 

la Salida:

Namespace(pic_resize=[128, 128])

Cuestiones relacionadas