2012-10-10 10 views
114

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

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

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

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

+5

あなたが別のプログラムにラッパーを書いていて、いくつかの引数を取得して変更したいが、残りの部分を渡したい場合は非常に便利です! –

+0

私はここでなぜ@AlanDeSmetになったのですか?私は何か狂ったことをしようとしていない喜んで:) – dwanderson

答えて

212

例えば

args, unknown = parser.parse_known_args() 

args = parser.parse_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'] 
+9

+1 - 'parse_known_args'のようなものがあることを知りませんでした – avasal

+2

私もしなかった!私はドキュメントhttp://docs.python.org/library/argparse.html?highlight=argparse#partial-parsingでそれを逃した。ありがとう – jdborg

+1

これは、parseargs(nosetest argsの使用を拒否しました)とnosetestを使用しようとしたときに発生しました。なぜなら、私が 'parser.parse_args([])ではな​​く' parser.parse_args私のテスト。 –

5

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

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

$ program --foo BAR a b +cd e 

私たちはこの名前空間付きデータコレクションを使用します。我々はArgumentParserを変更し、私たちが代わりに私たちの「認識」引数の+を使用しようとしている決めることができました、無視デフォルトの接頭辞-を望んでいた場合

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

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

同じコマンドが

NJOY)=あなたのパイプで、それを吸うことを入れて

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

が生成されます!

14

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

+0

これは 'parse_args()'で動作し、 'parse_known_args()'(Python 2.7では不要)です。 – OozeMeister

+2

argparse.REMAINDERを使用すると、長年にわたるバグが発生しているようです。私は確かにそれを働かせることはできません。 parse_known_args()は良い選択肢です。 – Matt

+0

今日の長期にわたるREMAINDERバグに直撃しました:https://bugs.python.org/issue17050 –

関連する問題