25

現在、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

次の方法で「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]

私の質問: デフォルトのヘルプ引数をオプションなどのグループに移動する方法はありますか? また、オプション引数のコンマの前のスペースを削除する方法が見つからないようです。理想的な出力は次のとおりです。

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

3 に答える 3

32

(thanks @mgilson!)を使用add_help=Falseして、組み込みのヘルプコマンドを無効にし、代わりに独自のヘルプコマンドを追加するために使用できます。action="help"

スペースを取り除くため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
于 2012-10-25T19:06:17.263 に答える
8

確かにあなたはそれを行うことができます。トリックはadd_help=FalseArgumentParserコンストラクターを追加してから、独自のヘルプ アクションをグループに追加することです。

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()
于 2012-10-25T19:03:52.853 に答える
0

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

基本的に、前の回答からのわずかな違いは、保存してからそのメソッドを繰り返し呼び出す必要がないgroupadd_argumentことです。

于 2016-10-05T07:56:47.723 に答える