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


206

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

これを上書きする方法はありますか?


14
別のプログラムにラッパーを作成していて、いくつかの引数をキャプチャして変更したいが、残りは渡す場合に非常に便利です。
アランデスメット2017年

2
まさにここに私がここに着いた理由@AlanDeSmet!クレイジーなことをやろうとしていないのがうれしい:)
dwanderson

回答:


351

交換する

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']

21
+ parse_known_args
1-次の

7
私もしませんでした!docsdocs.python.org/library/…でも見逃しました。ありがとう
joedborg 2012年

1
これは、parseargsでnosetestを使用しようとしたときに発生しました(nosetest argsを使用することを拒否しました)。理由は、テストparser.parse_args(None)ではなく実行していたためparser.parse_args([])です。
アンディヘイデン

3
FWIW、(parse_known_argsではなくIPython Notebookのすべてのセルに対する条件)の範囲内のコードでのparse_args使用を有効にするのでArgumentParserはなく、使用すると、呼び出されたスクリプトに最終的に移行する開発およびテストコードに大きく役立ちますコマンドラインから)if __name__ == 'main':True
ガンプション

1
これは、「既知」で渡されていないオプションの引数で動作するようには思えない。
Sharud

21

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


1
これparse_args()parse_known_args()(Python 2.7では)動作し、必要ありません。
OozeMeister 2017年

4
argparse.REMAINDERの使用は、長年のバグが多いようです。私は確かにそれを機能させることができません。parse_known_args()は良い代替手段です。
マット

1
今日、長年のREMAINDERバグに遭遇し
Scott Carpenter

7

実際、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!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.