36

私はこのpythonコードを持っています:

import os
try:
  os.system('wrongcommand')
except:
  print("command does not work")

コードは以下を出力します。

wrongcommand: command not found

の代わりにcommand does not work。エラーメッセージが表示されない理由を知っている人はいますか?

4

6 に答える 6

53

コマンドが存在しないときに例外をスローしたい場合は、次を使用する必要がありますsubprocess

import subprocess
try:
    subprocess.run(['wrongcommand'], check = True)
except subprocess.CalledProcessError:
    print ('wrongcommand does not exist')

考えてみれば、とにかくsubprocess代わりに使用する必要があります...os.system

于 2012-09-11T15:56:44.310 に答える
34

os.system() はメソッドの終了コードを通じて失敗を示すため

  • 戻り値 == 0 -> すべて OK
  • 戻り値 != 0 -> なんらかのエラー

呼び出されたコマンドの終了コードは、直接 Python に返されます。

失敗した場合に os.system() が例外を発生させることを示すドキュメントがあります。os.system() は、OS の基になる system() 呼び出しを呼び出し、その戻り値を返すだけです。

os.system() のドキュメントをよく読んでください。

于 2012-09-11T15:54:59.360 に答える
5

コード スニペットには 2 つの問題があります。まず第一に、単に do するのではなくtry: ... except:、処理したい例外を常に明確にします。そうしないと、プログラムは予期しないエラーも含め、あらゆる種類のエラーを単純に飲み込んでしまいます。ほとんどの場合、これにより、実行時の別の時点で予期しない動作が発生します。

さらに、ほとんどの場合、呼び出しはモジュールos.system()からの対応するものに置き換える必要があります。subprocess

何が問題なのかを確認するには、try/except ブロックを省略して、実際にトレースバック/例外を確認します。他の人が指摘したように、カスタム文字列が印刷されない理由であるケースには例外がないことに気付くでしょう。

結論: コード ブロックで発生する可能性のある特定の例外について考えてください。特定の理由で発生すると予想されるものをよく考え、それらを適切に処理してください。あなたが期待していないものを扱わないでください。

于 2012-09-11T15:54:27.253 に答える
1

wrongcommand: command not foundos.systemコマンドを呼び出すために使用して いるシェルの出力です。os.system例外をスローしませんでした

編集:mgilsonのコメントの一部をコピーして貼り付けて編集

于 2012-09-11T15:54:09.957 に答える