2012-07-26 5 views
6

Al usar el módulo argparse de Python, puede usar parse_known_args() para analizar únicamente los argumentos que conoce el analizador y los argumentos adicionales se devuelven por separado.Python argparse: mostrar el modo parse_known_args en la cadena de uso

Sin embargo, este hecho no se indica en la cadena de uso/ayuda. Por supuesto que podría ponerlo en el campo description del analizador, pero me pregunto si hay una buena manera de incluirlo en la línea de uso.

Lo que estoy buscando es un resultado de, p. usage: test [-h] ... en lugar de usage: test [-h]

Respuesta

3

creo que se podría hacer esto con una combinación de format_usage() y la ArgumentParser atribuyen usage. Tenga en cuenta que esa sección muestra el uso como un argumento de palabra clave para el constructor, sin embargo, inspeccionando the source para usage muestra que puede acceder a ella después de la construcción como parser.usage.

me imagine que su solución final sería algo como:

parser = argparse.ArgumentParser() 
# Add arguments... 
usage = parser.format_usage() 
parser.usage = usage.rstrip() + ' ...\n' 
+2

Gracias, que casi hizo el trabajo. La cadena de uso termina con un '\ n', por lo que debe tenerse en cuenta primero:' parser.usage = '% s ... \ n'% parser.format_usage(). Rstrip() ' – ThiefMaster

2

parse_known_args() es para la conveniencia del programador escribir el programa, no es algo que el usuario del programa tiene que preocuparse. Si define correctamente sus argumentos de línea de comandos, argparse le da algo similar automáticamente:

>>> import argparse 
>>> p = argparse.ArgumentParser(prog='command') 
>>> x=p.add_argument("foo", nargs=argparse.REMAINDER) 
>>> p.parse_args(["--help"]) 
usage: command [-h] ... 

positional arguments: 
    foo 

optional arguments: 
    -h, --help show this help message and exit 
+0

Ah, bien, desafortunadamente el estilo 'foo [foo ...]' es bastante incómodo para mi caso ya que en realidad es un único argumento que puede contener espacios en un entorno donde no hay comillas ni barras diagonales inversas, es decir, el único argumento que puede contener espacios es el último fusionándolo con cualquier no args. – ThiefMaster

+0

Ah, intenta 'nargs = argparse.REMAINDER'. Eso colocará todos los argumentos posicionales restantes en una lista, y pone convenientemente "..." en la cadena de ayuda como desee. – chepner

Cuestiones relacionadas