7

os.system()Python (Linux システム上) で、リターン コードを使用して取得するコマンドを起動しています。そのリターン コードが 0 以外の場合は、同じリターン コードでプログラムを終了させたいと考えています。だから私は書いた:

ret = os.system(cmd)
if ret != 0:
   print "exit with status %s" % ret
   sys.exit(ret)

戻りコードが 256 より小さい場合は正常に動作しますが、255 より大きい場合、使用される終了コードは 0 です。sys.exit() が 255 より大きいコードを受け入れるようにするにはどうすればよいですか?

編集:制限は実際には255です

実際、ret変数は 256 を受け取りsys.exit()ますが、それを使用しないため、プログラムは代わりに 0 を返します。手動で起動するとcmd、256 ではなく 1 が返されます。

4

3 に答える 3

6

実際、ドキュメントはそれを示しています

終了ステータス表示: 16 ビットの数値。下位バイトはプロセスを強制終了したシグナル番号で、上位バイトは終了ステータス (シグナル番号がゼロの場合) です。コア ファイルが作成された場合は、下位バイトの上位ビットが設定されます。

したがって、次のように、実際の終了ステータスを取得するために、sys.exit() によって返された番号を処理する必要があります。

ret = os.system(cmd)
# Ignore the first byte, use the second one only
ret = ret >> 8
if ret != 0:
   print "exit with status %s" % ret
   sys.exit(ret)

ret には 256 ではなく 1 が含まれています。

于 2010-12-15T09:40:01.400 に答える
3

システムは 128 を超える終了コードを自分用に予約しているため、そうすべきではありませ。戻りコードが 0 から 127 の場合、プログラムが単独で終了したことを意味します。戻りコードが 128 より大きい場合、プログラムがシステムシグナル (SIGKILL または SIGTERM など) によって終了されたことを意味します。シグナル番号は、結果コードから 128 を引いたものです。

それを検出して、別の種類の出力表示を行う必要があると思います。おそらく、戻りコードを STDOUT に出力してから、0 (通常の終了、通常の出力) または 1 (cmd がゼロ以外の戻り値を持っていた、出力は何かを意味する) のいずれかで戻ります。

編集:どうやら(このコメントから)、Pythonはシェルスクリプトよりも賢いです...通常のLinux終了コードに戻すには、これを試してください:

subprocess_exit_code = (ret >> 8) & 0x7f
subprocess_signal_number = ret & 0xff

if subpprocess_signal_number == 0:
  exit_code = subprocess_exit_code
else:
  exit_code = 128 + subprocess_signal_number

これはコアダンプ情報を無視しますが。

于 2010-12-15T09:24:20.613 に答える
-3

私のために動作します(CentOS 5.5、Python 2.6.5):

$ python
>>> import sys
>>> sys.exit(245)
$ echo $?
245
于 2010-12-15T09:22:19.113 に答える