26

Python の optparse モジュールを使用して、通常の使用法の出力の下に例の行を追加したいと思います。私の現在の help_print() 出力は次のようになります。

usage: check_dell.py [options]

options:
-h, --help     show this help message and exit
-s, --storage  checks virtual and physical disks
-c, --chassis  checks specified chassis components

私の職場で *nix の読み書きが苦手なユーザー向けの使用例を含めたいと思います。このようなもの:

usage: check_dell.py [options]

options:
-h, --help     show this help message and exit
-s, --storage  checks virtual and physical disks
-c, --chassis  checks specified chassis components

Examples:

check_dell -c all
check_dell -c fans memory voltage
check_dell -s

どうすればこれを達成できますか? そのようなことを可能にする optparse オプションは何ですか? 現在のコード:

import optparse

def main():
    parser = optparse.OptionParser()
    parser.add_option('-s', '--storage', action='store_true', default=False, help='checks virtual and physical disks')
    parser.add_option('-c', '--chassis', action='store_true', default=False, help='checks specified chassis components')

(opts, args) = parser.parse_args()
4

6 に答える 6

43
parser = optparse.OptionParser(epilog="otherstuff")

デフォルトformat_epilogでは改行が削除される (textwrap を使用する) ため、format_epilogこのようにパーサーでオーバーライドする必要があります。

def main():

    class MyParser(optparse.OptionParser):
        def format_epilog(self, formatter):
            return self.epilog

    parser =MyParser(epilog=
"""Examples:

check_dell -c all
check_dell -c fans memory voltage
check_dell -s
""")
...

もう少し詳しく説明します。クラス
を調べると、によって呼び出されるメソッドがありますoptparse.pyOptionParserformat_epilogformat_help

ここに optparse.py のスニペットがあります

def format_epilog(self, formatter):
    return formatter.format_epilog(self.epilog)

def format_help(self, formatter=None):
    if formatter is None:
        formatter = self.formatter
    result = []
    if self.usage:
        result.append(self.get_usage() + "\n")
    if self.description:
        result.append(self.format_description(formatter) + "\n")
    result.append(self.format_option_help(formatter))
    result.append(self.format_epilog(formatter))
    return "".join(result)

のデフォルトの動作は、とりわけ whichformatter.format_epilogを使用して、エピローグから改行を取り除くことです。textwrap.fill改行を保持したいので、サブクラスOptionParser化して動作を変更しますformat_epilog

于 2009-12-07T01:57:59.680 に答える
12

勝者の答え(自分のコードで同じ問題を解決するのに役立ちました)について詳しく説明すると、クラスのメソッドを識別メソッドで直接オーバーライドするという手っ取り早いオプションの 1 つがあります。

optparse.OptionParser.format_epilog = lambda self, formatter: self.epilog
optparser = optparse.OptionParser(epilog=helptext)

ヘルプテキストを逐語的なエピローグとして出力します。

ただし、これにより、プログラムで OptionParser クラスを使用するすべてのエピローグ形式がオーバーライドされると思います。そのため、プログラムの他の場所で OptionParser を使用する場合、そのようなエピローグはすべて逐語的に渡す必要があります。

于 2011-02-03T05:54:44.993 に答える
5

usage次のパラメーターを使用します。

usage = "usage: %prog [options] arg1 arg2"
parser = OptionParser(usage=usage)

次の方法でさらに追加できます (ほんの一例):

group = OptionGroup(parser, "Dangerous Options",
                    "Caution: use these options at your own risk.  "
                    "It is believed that some of them bite.")
group.add_option("-g", action="store_true", help="Group option.")
parser.add_option_group(group)

出力例:

使い方: [オプション] arg1 arg2

オプション: -h, --help このヘルプ メッセージを表示して終了します
-v, --verbose 多くのノイズを発生させます [デフォルト]
-q, --quiet 非常に静かにします (ワビットを探しています)
-fFILE, --file= FILE write output to FILE
-mMODE, --mode=MODE インタラクション モード: 「初心者」、「中級者」、[デフォルト]、「専門家」のいずれか

危険なオプション: 注意: これらのオプションの使用は、自己責任で行ってください。それらのいくつかは噛むと考えられています。-g グループ オプション。

こちらをご覧ください。

于 2009-12-07T01:51:22.220 に答える
4

これを行う方法に関する別のアイデアは、デフォルトの動作を無効にして、デフォルト-hのヘルプ画面を含めることができる独自のヘルプ画面を印刷することです。

from optparse import OptionParser

parser = OptionParser(add_help_option=False, 
                      epilog="This can't be easily\n multilined")
parser.add_option('-h', '--help', dest='help', action='store_true',
                  help='show this help message and exit')

(options, args) = parser.parse_args()

if options.help:
    parser.print_help()
    print 'now we have an epilog'
    print 'with as many lines as you wish'
    sys.exit()

これは基本的に、パーサーが のデフォルトの動作で行うことですが、もちろんsadd_help_option=Trueは除きます。print

しかし、正直なところ、最初と最後に任意の数の説明行を単純に追加する方法も好みます。

于 2010-05-13T20:49:19.270 に答える
2

コンストラクターdescriptionに渡すことができるパラメーターがあります。これにより、 の後、オプションのリストの前にOptionParser表示される任意のテキストを含めることができます。usage

16.4.3.1を参照してください。パーサーの作成

于 2009-12-07T01:54:49.700 に答える