私たちは、使用しているコマンドラインツールでラッパースクリプトを構築しようとしています。ラッパースクリプトのオプションに基づいていくつかのツール引数を設定したいと考えています。ネイティブ引数をコマンドラインツールに直接渡す可能性もあります。コマンドラインで記述されているとおりです。ここでダッシュで始まるオプションの位置引数付きのargparse
は、私たちが思い付いたものです:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('positional')
parser.add_argument('-f', '--foo', action='store_true')
parser.add_argument('-b', '--bar', action='store_true')
parser.add_argument('native_arg', nargs='*')
args = parser.parse_args()
print (args)
positional
は必須です。 -f
と-b
のオプションに基づいて、ツール呼び出しにいくつかのオプションが追加されます。後で残っているもの(あれば)は、ネイティブのツール引数として扱われ、ツールに直接与えられます。 -h
で私たちのスクリプトを呼び出すと、次の利用状況を生成します。
usage: test.py [-h] [-f] [-b] positional [native_arg [native_arg ...]]
トリックは、これらのネイティブの引数は、ツールのオプションそのものであり、例えば、-native0
と-native1
のために、主要なダッシュを含有していることです。我々はすでにダブルダッシュでトリックについて知っているargparseより多くのオプションを探しています。次の呼び出し:
./test.py pos -- -native0 -native1
が期待される解析された引数を生成します。
Namespace(bar=False, foo=False, native_arg=['-native0', '-native1'], positional='pos')
はしかし、動作しません最初の位置引数の後にオプションを追加しようとしています。具体的には、次の呼び出し:印刷され、次のように、
./test.py --foo pos -- -native0 -native1
が動作しているようです:positionals前に、オプションの引数を置く
usage: [...shortened...]
test.py: error: unrecognized arguments: -- -native0 -native1
:
./test.py pos --foo -- -native0 -native1
は、次の出力を生成します:
Namespace(bar=False, foo=True, native_arg=['-native0', '-native1'], positional='pos')
native_arg
〜'+'
の値をnargs
に変更しても、上記のすべての状況に当てはまります(注意が必要ですが、少なくとも1つはnative_arg
と予想されます)。
私たちはPythonコードで何か間違っているのですか、これは何らかの種類のですか?argparse bug?
私はまた、 '--'の前にあるものだけを解析し、残りを1つの大きなブロブとして取得するいくつかの方法に満足しています。 'parse_known_args'はスクリプトオプションのようなものを' native_args'に伝えることができます。私はそれについて少し考えており、2つの連鎖されたサブパワーの組み合わせで解けるかもしれません。ネイティブargsは主に他のスクリプトでも使用されるので、 '--'の前に常に終わるという回避策を使用することは受け入れられると思います。 –
二重ダッシュは '-native0'のような文字列をどのように解釈するのかを変更しますが、 'positionals'にどのように割り当てられているかは変わりません。 'nargs = '...''、 'REMAINDER'もありますが、同じ割り当て問題があると思います。私は後でそれをテストすることができます。 – hpaulj
私はそれを試して、それは '位置'が最初に見られた後すべてを食べる。つまり、 'test.py position --foo - -native0'では、' --foo'オプションが 'native_args'に集められます。 –