web-dev-qa-db-ja.com

Python tryブロックはos.system例外をキャッチしません

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

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

コードは次のように出力します。

wrongcommand: command not found

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

21
Cinder

コマンドが存在しないときに例外がスローされるようにするには、subprocessを使用する必要があります。

 import subprocess
 try:
     subprocess.call(['wrongcommand'])
 except OSError:
     print ('wrongcommand does not exist')

考えてみてください。とにかくos.systemではなくsubprocessを使用する必要があります...

27
mgilson

Os.system()はメソッドの終了コードを通じて失敗を示しているため

  • 戻り値== 0->すべて正常
  • 戻り値!= 0->何らかのエラー

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

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

Os.system()のドキュメント注意深くを読んでください。

14
Andreas Jung

コードスニペットに2つの問題があります。まず第一に、_try: ... except:_を実行するだけではなく、処理する例外について常に特定してください。それ以外の場合、プログラムは、あらゆる種類のエラーだけでなく、予期しないエラーも吸収します。ほとんどの場合、これにより、実行時の他の時点で予期しない動作が発生します。

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

何が問題なのかを確認するには、try/exceptブロックを省略して、実際にtraceback/exceptionを確認します。他の人が指摘したように、あなたのケースには例外がないことに気づくでしょう。そのため、カスタム文字列は出力されません。

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

3

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

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

1
gefei

最も簡単な方法がもう1つあります。

import os

def dat():
        if os.system('date') == 0:
            print("Command successfully executed")
        else:
            print("Command failed to execute")

dat()
0
Preetesh Sharma

サブプロセスはあなたの親友かもしれませんが。 os.systemはまだどこかで、特にプログラマーがC/C++モードでプレイするのに役立ちます。

したがって、コードは以下になります。

import os
try:
  os_cmd = 'wrongcommand'
  if os.system(os_cmd) != 0:
      raise Exception('wrongcommand does not exist')
except:
  print("command does not work")

0
Shouton Eulle