web-dev-qa-db-ja.com

Python argparseは認識されない引数を無視します

Optparse、古いバージョンは認識されない引数をすべて無視して続行します。ほとんどの場合、これは理想的ではなく、argparseで変更されました。ただし、認識されない引数を無視して、指定した引数を解析したい状況がいくつかあります。

例えば:

parser = argparse.ArgumentParser()
parser.add_argument('--foo', dest="foo")
parser.parse_args()

$python myscript.py --foo 1 --bar 2
error: unrecognized arguments: --bar

とにかくこれを上書きすることはありますか?

164
jdborg

交換

args = parser.parse_args()

args, unknown = parser.parse_known_args()

例えば、

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo')
args, unknown = parser.parse_known_args(['--foo', 'BAR', 'spam'])
print(args)
# Namespace(foo='BAR')
print(unknown)
# ['spam']
287
unutbu

残りの部分を使用する場合は、parser.add_argument('args', nargs=argparse.REMAINDER)を使用して残りの部分を新しい引数に入れることができます。

16
lichenbo

実際、argparseは_unrecognized_argsをまだ「無視」します。これらの「認識されない」引数デフォルトのプレフィックスを使用しないであれば、パーサーから苦情は聞こえません。

次の引数でプログラムを実行する場合は、@ anutbuの設定を使用しますが、標準のparse.parse_args()を使用します。

$ program --foo BAR a b +cd e

この名前空間のデータコレクションを使用します。

Namespace(_unrecognized_args=['a', 'b', '+cd', 'e'], foo='BAR')

デフォルトのプレフィックス-を無視したい場合は、ArgumentParserを変更し、代わりに「認識された」引数に+を使用することにします。

parser = argparse.ArgumentParser(prefix_chars='+')
parser.add_argument('+cd')

同じコマンドが生成します

Namespace(_unrecognized_args=['--foo', 'BAR', 'a', 'b'], cd='e')

それをパイプに入れて吸ってください=)

nJoy!

7
nickl-