2

コマンドラインを処理するために argparse を使用するプログラムがあります。プログラムのコマンドライン、つまりヘルプは状況依存になります。その文脈依存性をヘルプに反映させたいと思います。

例えば

prog --mode=1 OPTA OPTB OPTC<br>
prog --mode=2 OPTD OPTE OPTF<br>

prog --mode=1 -h<br>
"In mode 1 you have four options, A,B,C,D"

prog --mode=2 -h<br>
"You mode 2 you have four options, D,E,F,G"

これは一例に過ぎないことをここで付け加えておきます。私の実際のプログラムでは、任意の数のモードが存在する可能性があり、それらは私のコードでは定義されておらず、API のユーザーによって定義されています。したがって、各モードのヘルプをハードコーディングすることは不可能です。実際のヘルプ テキストは後で定義します。

これは、 --mode 引数が処理された後に、引数 'option' のヘルプ文字列を変更して、さまざまなモードを反映することを意味します。以下のコードは、コマンドが期待どおりに機能するという点で基本的に機能しますが、ヘルプは機能しません。

問題は、 parse_known_args() が -h を処理してから終了するように見えることです。私parse_args()は助けを処理する必要があります。明らかに、単純に解析して自分自身sys.argvを見つけることができ--modeましたが、確かにそれは のオブジェクトを無効にしますargparse

import argparse

parser = argparse.ArgumentParser(description='Test argparser')
parser.add_argument('--mode', nargs=1, type=int,
                    default=[1],
                   help='program mode')

options={
    1:["OPTA","OPTB","OPTC","OPTD"],
    2:["OPTD","OPTE","OPTF","OPTG"]}


args = parser.parse_known_args()[0]

print "Initial pass"
print args

parser.add_argument('options', type=str, nargs='+',
                    choices=options[args.mode[0]]+["ALL"],
                    default="ALL",
                   help='One or more of the options, above')

args = parser.parse_args()

print "Second pass"
print args
4

1 に答える 1

3

あなたがしたいことは、argparseのサブコマンドによって処理されます。サブコマンドを使用すると、 --mode オプションをサブコマンドに置き換えることになります。

prog --mode=1 OPTA OPTB OPTC

になるだろう

prog mode1 OPTA OPTB OPTC

サブコマンドにはmode1独自のヘルプを与えることができます。でアクセスします

prog mode1 -h

このアプローチのもう 1 つの利点はprog -h、可能なサブコマンド (および関連する説明) をリストすることです。

于 2012-11-19T11:49:03.870 に答える