2012-10-25 12 views
20

Attualmente sto creando un programma di lettura directory usando Python. Sto usando 'argparse' per analizzare gli argomenti dalla riga di comando. Ho il seguente codice:Spostare "help" in un diverso gruppo di argomenti in python argparse

parser = argparse.ArgumentParser(prog = "LS.py", 
           usage = "%(prog)s [options] [path1 [path2 [...pathN]]]\nThe paths are optional; if not given . is used.") 

group = parser.add_argument_group("Options") 

group.add_argument("-path", default = ".", help = argparse.SUPPRESS, metavar = "") 
group.add_argument("-m", "--modified", default = False, 
        help = "show last modified date/time [default: off]", 
        metavar = "") 
group.add_argument("-o ORDER", "--order=ORDER", nargs = 2, default = "name", 
        help = "order by ('name', 'n', 'modified', 'm', 'size', 's')\n[default: name]", 
        metavar = "") 
group.add_argument("-r", "--recursive", default = False, 
        help = "recurse into subdirectories [default: off]", 
        metavar = "") 
group.add_argument("-s", "--sizes", default = False, 
        help = "show sizes [default: off]", metavar = "") 

args = parser.parse_args() 
return args 

quando viene chiamato nel seguente modo "LS.py -h" produce il seguente output:

usage: LS.py [options] [path1 [path2 [...pathN]]] 
The paths are optional; if not given . is used. 

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

Options: 
    -m , --modified  show last modified date/time [default: off] 
    -o ORDER , --order=ORDER 
        order by ('name', 'n', 'modified', 'm', 'size', 's') 
        [default: name] 
    -r , --recursive  recurse into subdirectories [default: off] 
    -s , --sizes   show sizes [default: off] 

La mia domanda: C'è un modo per spostare il default aiuto argomento in un gruppo come Opzioni? Inoltre, non riesco a trovare un modo per rimuovere lo spazio prima delle virgole negli argomenti delle Opzioni. L'output ideale è:

Usage: ls.py [options] [path1 [path2 [...pathN]]] 
The paths are optional; if not given . is used. 

Options: 
    -h, --help   show this help message and exit 
    -m, --modified  show last modified date/time [default: off] 
    -o ORDER, --order=ORDER 
         order by ('name', 'n', 'modified', 'm', 'size', 's') 
         [default: name] 
    -r, --recursive  recurse into subdirectories [default: off] 
    -s, --sizes   show sizes [default: off] 

risposta

24

È possibile utilizzare add_help=False per disabilitare il comando built-in aiuto e aggiungere il proprio, invece, utilizzando action="help" (grazie @mgilson!)

Per eliminare gli spazi, non impostare metavar su una stringa vuota. Le opzioni devono essere specificati utilizzando action="store_true" per renderli veri opzioni (argomento-less):

import argparse 

parser = argparse.ArgumentParser(prog="LS.py", 
           usage="%(prog)s [options] [paths...]\nThe paths are optional; if not given . is used.", 
           add_help=False) 

group = parser.add_argument_group("Options") 

group.add_argument("-h", "--help", action="help", help="show this help message and exit") 
group.add_argument("-path", default=".", help=argparse.SUPPRESS) 
group.add_argument("-m", "--modified", action="store_true", 
        help="show last modified date/time") 
group.add_argument("-o", "--order", nargs=1, default="name", 
        help="sort order (n[ame], m[odified], s[ize])\n[default: name]") 
group.add_argument("-r", "--recursive", action="store_true", 
        help="recurse into subdirectories") 
group.add_argument("-s", "--sizes", action="store_true", 
        help="show sizes") 

args = parser.parse_args() 

uscita:

Options: 
    -h, --help   show this help message and exit 
    -m, --modified  show last modified date/time 
    -o ORDER, --order ORDER 
         sort order (n[ame], m[odified], s[ize]) [default: 
         name] 
    -r, --recursive  recurse into subdirectories 
    -s, --sizes   show sizes 
+0

È ancora più semplice se si utilizza 'action =" help "' invece di 'action =" store_true "' – mgilson

+0

Derp, devo averlo perso mentre si sfogliava i documenti di azione. Grazie! – nneonneo

+0

Questo ha risposto a tutte le mie domande, grazie mille. Ho cercato per un po 'la documentazione e non riuscivo a trovarlo. –

6

Certo che puoi farlo. Il trucco è quello di aggiungere solo add_help=False il costruttore ArgumentParser e quindi aggiungere la tua azione di aiuto al gruppo:

import argparse 

parser = argparse.ArgumentParser(prog = "LS.py", 
           usage = "%(prog)s [options] [path1 [path2 [...pathN]]]\nThe paths are optional; if not given . is used.", 
           add_help=False) 

group = parser.add_argument_group("Options") 

group.add_argument("-path", default = ".", help = argparse.SUPPRESS, metavar = "") 
group.add_argument("-m", "--modified", default = False, 
        help = "show last modified date/time [default: off]", 
        metavar = "") 
group.add_argument("-o ORDER", "--order=ORDER", nargs = 2, default = "name", 
        help = "order by ('name', 'n', 'modified', 'm', 'size', 's')\n[default: name]", 
        metavar = "") 
group.add_argument("-h", "--help", action='help', help='print this fabulous help message') 
group.add_argument("-r", "--recursive", default = False, 
        help = "recurse into subdirectories [default: off]", 
        metavar = "") 
group.add_argument("-s", "--sizes", default = False, 
        help = "show sizes [default: off]", metavar = "") 

args = parser.parse_args() 
0

per condensare e semplificare un po 'sul precedente answer by nneonneo, si può avere:

import argparse 

parser = argparse.ArgumentParser(prog="LS.py", 
           usage="%(prog)s [options] [paths...]\nThe paths are optional; if not given . is used.", 
           add_help=False) 

add_arg = parser.add_argument_group("Options").add_argument 

add_arg("-h", "--help", action="help", help="show this help message and exit") 
add_arg("-path", default=".", help=argparse.SUPPRESS) 
add_arg("-m", "--modified", action="store_true", 
     help="show last modified date/time") 
add_arg("-o", "--order", nargs=1, default="name", 
     help="sort order (n[ame], m[odified], s[ize])\n[default: name]") 
add_arg("-r", "--recursive", action="store_true", 
     help="recurse into subdirectories") 
add_arg("-s", "--sizes", action="store_true", 
     help="show sizes") 

args = parser.parse_args() 

Fondamentalmente, la leggera variazione dalla risposta precedente è che non è necessario salvare group e t gallina chiama ripetutamente il metodo add_argument su di esso.

Problemi correlati