2016-11-08 7 views
0
python -i prog.py -h 

上記のコマンドを呼び出すと、トレースバックと 'SystemExit:0'で予想される出力が得られます。 '-i'を指定しないと、トレースバックなしで期待される出力が得られます。なぜこれが起こり、トレースバックなしで同じコマンドでpythonフラグとプログラムフラグの両方を使用する方法がありますか?argparseをpythonとprogramの両方のフラグに使う方法は?

+0

あなたのコードを見ることなく伝えることが難しいです。私が試した基本的な例は問題なく動作します。どのプラットフォームを実行していますか? Windows? Linux? – scotty3785

+0

@ scotty3785私はlinux(ubuntu 15.10)で動作しています。 – Jay

答えて

1

-iフラグを指定してPythonを実行すると、sys.exitなどで使用されるSystemExit例外の処理が変更されます。通常、キャッチされていないSystemExitは、Pythonを自動的に終了させます。しかし、-iがオンの場合、SystemExitは、トレースバックとすべてを含む他の例外と同様に処理されます。

SystemExitのトレースバックを-iでオンにする場合は、明示的にキャッチして無視する必要があります。例えば、docsから

def main(): 
    try: 
     ... 
    except SystemExit: 
     # Catch the exception to silence the traceback when running under python -i 
     pass 

if __name__ == '__main__': 
    main() 
+0

ああ、これはargparseと対話モードで終了することとは関係がありません。混乱を避けるためにこの質問を削除してください。 – Jay

+0

@ジェイ:将来の読者にはこの質問が役に立つかもしれないようです。私はそれを残すだろう。 – user2357112

1

exception SystemExit 
This exception is raised by the sys.exit() function. When it is not handled, the Python interpreter exits; no stack traceback is printed. 

argparseは「-h」オプションとSystemExit例外を採用して、あなたは、コマンドライン引数「-i」あなたと対話モードに入るので、トレースバックを参照してください。トレースバックは、あなたが実装し、別のオプションで送信する場合、印刷されないであることに注意してください:

即時
python -i prog.py -p 80 

二つの「クイックフィックス」私は考えることができます(ただし、実際に、それはあなたが本当に必要なのです何に降りてきますこのために?)に入れ

  1. のtry-以外句あなたの引数を解析するとき。

  2. のpython -i prog.py -h 2>を/ dev/null

関連する問題