3

私はすでにスタックオーバーフローでこれに対する答えを調べようとしましたが、私の特定のケースに対する正確な答えを見つけることができません.

この最初のリンクには、最初のセクションに同じ質問がありますが、回答がありません ( python argparse: parameter=value )。そして、この2番目の質問は似ていますが、私の特定のケースではうまくいかないようです( argparseを使用してフォーム "arg= val"の引数を解析します)。

だから私の状況はこれです - 私は他の多くのスクリプトで使用されているpythonラッパーを書き直しています(これらの他のスクリプトを変更したくないです)。現在、python ラッパーは--key=value、さまざまな引数の形式のコマンド ライン引数で呼び出されますが、手動で解析されました。それらをargparseで解析したいと思います。

注: 引数名が扱いにくいためdest、add_argument のオプションを使用して名前を変更しています。

parser = argparse.ArgumentParser(description='Wrappin Ronnie Reagan')
parser.add_argument("--veryLongArgName1", nargs=1, dest="arg1", required=True)
parser.add_argument("--veryLongArgName2", nargs=1,   dest="arg2")
parser.add_argument("--veryLongArgName3", nargs=1,  dest="arg3")
userOpts = vars(parser.parse_args())

渡されたコマンドラインを正しく解析しているように見えますが、これをヘルプとして表示します。

usage: testing_argsparse.py [-h] --veryLongArgName1 ARG1
                        [--veryLongArgName2 ARG2]
                        [--veryLongArgName3 ARG3]
testing_argsparse.py: error: argument --veryLongArgName1 is required

しかし、私が望むのは、すべてのパラメータが--key=valueではなく、フォーマットで指定されることです--key value。すなわち

usage: testing_argsparse.py [-h] --veryLongArgName1=ARG1
                        [--veryLongArgName2=ARG2]
                        [--veryLongArgName3=ARG3]
testing_argsparse.py: error: argument --veryLongArgName1 is required

前もって感謝します!

4

2 に答える 2

1

少し遅れましたが、OP と同様のリクエストがある場合は、カスタムHelpFormatterを使用できます。

class ArgFormatter(argparse.HelpFormatter):
    def _format_args(self, *args):
        result = super(ArgFormatter, self)._format_args(*args)
        return result and '%%%' + result

    def _format_actions_usage(self, *args):
        result = super(ArgFormatter, self)._format_actions_usage(*args)
        return result and result.replace(' %%%', '=')

これをArgumentParserに渡して、必要な動作を与えることができます。

parser = argparse.ArgumentParser(
    description='Wrappin Ronnie Reagan',
    formatter_class=ArgFormatter)

これは args ( ARG1, ARG2, ...) をインターセプトし、カスタム プレフィックスを追加します。このプレフィックスは後で (不要なスペースと共に)=シンボルに置き換えられます。return ステートメントのandは、結果が空でない場合にのみ結果を変更するようにします。

于 2018-01-15T02:56:49.420 に答える