2010-12-15 20 views
6

Python(Linuxシステム)では、私はを使ってコマンドを起動し、戻りコードを取得しています。その戻りコードが0と異なる場合は、同じ戻りコードでプログラムを終了させたいと思います。だから私は書いた:Pythonでsys.exit()の0-255の範囲制限をバイパスする方法は?

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

戻りコードが256より低い場合、それは正常に動作しますが、それは255より大きいだ際に、使用終了コードは、私はsys.exitを作ることができますどのように()のコードは大きい受け入れる0です。 255より?

編集:制限は実際には、実際に255

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

答えて

0

ワークス(CentOSの5.5はPython 2.6.5)、それは1を返すことを参照してください。

$ python 
>>> import sys 
>>> sys.exit(245) 
$ echo $? 
245 
+0

これは正しくありません。同じことはテストしません。 – unwind

+0

申し訳ありませんが、私の悪いです、制限は255ではなく、127です。 –

+2

255制限は、シェルによって強制されます:http://tldp.org/LDP/abs/html/exit-status.htmlとhttp:// tldp。 org/LDP/abs/html/exitcodes.html –

2

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

これを検出して、他の種類の出力指示を行う必要があります。おそらく、戻りコードをSTDOUTに出力し、0(通常出口、通常出力)または1(cmdは0以外の戻り値を持っています。出力は何かを意味します)のいずれかを返します。

編集:どうやら(this commentから)、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 

をダンプ情報。

5

実際、documentationを示し

終了ステータス表示その:16ビット数、その低バイト高バイト終了状態である信号処理を殺した回数、及びである(信号は、IF数字はゼロです)。コアファイルが作成された場合は、下位バイトの上位ビットがセットされます。

だから私はそうのように、実際の終了ステータスを取得するために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は、1の代わりに256が含まれています

+0

ああ私はちょうどsegfaulty終了時に0x8b00を返すのか不思議に思った。 – ulidtko

+0

私は、コアをダンプすると、コマンドラインから実行した場合に得られるはずのコードとは異なる終了コードを与えると思います。 –

+1

'os.system'の代わりに' subprocess.call'を使うことができます:compare 'python -c 'import os; print [os.system(["。[127,128,255,256,257]] 'と 'python -c'のiのサブプロセスをインポートするサブプロセス print [subprocess.call([" ./ exit-with "、str(i)]] )for for [127,128,255,256,257]] '' exit-with'はhttp://ideone.com/zFelCです – jfs

関連する問題