2013-02-06 12 views
31

私はこれが可能だとは思わないが、私はargparseから例外を処理したい。例えば私はPythonのargparseに使用法ではなく例外をスローするようにしたい

$ myapp.py 
usage: myapp --foo foo 
myapp: error: argument --foo is required 

をしかし、私はそれではなく、例外に該当したい:

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument('--foo', help='foo help', required=True) 
try: 
    args = parser.parse_args() 
except: 
    do_something() 

私はそれを実行します。

+2

あなたは、それが何のために設計されたのかについて、argparseを使用していません。あなたは何をしたいですか? –

+9

それ以外の素晴らしいライブラリの仕方を変えて、それを特定のプロジェクトに合わせるだけでは、悪いことではありません。 – jdborg

+4

実際にあなたはすでにそれを行うことができます。単純に 'SystemExit'をキャッチし、' sys.stderr'を他のオブジェクトに置き換えてください。 – Bakuriu

答えて

55

あなたはArgumentParserをサブクラス化し、エラーが発生したときに別の何かをするerrorメソッドをオーバーライドすることができます。

class ArgumentParserError(Exception): pass 

class ThrowingArgumentParser(argparse.ArgumentParser): 
    def error(self, message): 
     raise ArgumentParserError(message) 

parser = ThrowingArgumentParser() 
parser.add_argument(...) 
... 
+0

それはそれのようなものになると思った。明確な答えをありがとう。 – jdborg

+3

私はこれがオプションだとうれしいですが、このようなことを避けることを望んでいました。あなたは、 "エラー:引数が少なすぎる"という通知を受け取ったときにヘルプメニューを表示しようとしています。私のargparseのセットアップには、少なくとも1つの引数が必要ですが、 "-h"パラメータを指定してスクリプトを実行しなくても、それらのコマンドを出力することができます。何かのように: 'parser.set_error( '引数が少なすぎる、method_to_deal_with_error)' この機能が必要な場合は、いつでもバグを報告することができます。ありがとう! – NuclearPeon

12

私の場合には、argparse版画「少なすぎる引数」を終了します。 argparseコードを読んだあと、メッセージを出力した後sys.exit()を呼び出すだけであることがわかりました。 sys.exit()はSystemExit例外をスローしますが、この例外を捕捉するだけです。

だから、これを試してみてください。

try: 
     args = parser.parse_args(args) 
    except SystemExit: 
     .... your handler here ... 
     return 
+1

はい、このオプションは上記のBakuriuのコメントで言及されています。 unittestingの 'test_argparse.py'ファイルは' ErrorRaisingArgumentParser'クラスを作成するために 'error'を再定義するのと一緒にこのアプローチを使います。 – hpaulj

+3

エラーメッセージがstderrにスローされます。それをキャッチする方法はありますか? – Raj

+1

@Raj stderrを別のストリーム/ファイルオブジェクトに一時的にリダイレクトすることができます(例:https://stackoverflow.com/a/6796752/2128769)。 – umi

関連する問題