2012-10-25 60 views
20

当前我正在使用Python创建一个目录读取器程序。 我使用'argparse'从命令行解析参数。我有以下代码:在python argparse中将“help”移动到不同的参数组中

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 

当通过以下方式“LS.py -h”它产生以下输出叫做:

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] 

我的问题:是否有移动的默认方式帮助参数进入诸如Options之类的组? 此外,我似乎无法找到一种方法来删除Options参数中的逗号前的空格。理想的输出是:

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] 

回答

24

您可以使用add_help=False禁用内置帮助命令,并添加你自己的,而不是使用action="help"(谢谢@mgilson!)

要除去空格,请不要将metavar设置为空字符串。您的选择应该使用action="store_true",使他们真(参数少)选项来指定:

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

输出:

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

如果您使用'action =“help”'而不是'action =“store_true”' – mgilson

+0

Derp,我一定在浏览动作文档时一定错过了它。谢谢! – nneonneo

+0

这回答了我所有的问题,非常感谢。我一直在浏览文档一段时间,似乎无法找到它。 –

6

当然,你可以做到这一点。诀窍是只需添加add_help=False中的ArgumentParser构造函数,然后添加自己的帮助行动组:

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

为了缩小和简化在以前answer by nneonneo一点,你可以有:

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

基本上,从以前的答案稍有不同的是,没有必要保存group和T母鸡反复调用add_argument方法

相关问题