7

関連する質問で、C 関数「待機」のドキュメントがどこにあるかを尋ねました。これは、commands.getstatusoutput() モジュールのリターン コードを把握するための試みでした。Stackoverflow は成功しましたが、ドキュメントは役に立ちませんでした。これが私を困惑させるものです:

#!/usr/bin/python
import commands
goodcommand = 'ls /'
badcommand = 'ls /fail'
status, output = commands.getstatusoutput(goodcommand)
print('Good command reported status of %s' % status)
status, output = commands.getstatusoutput(badcommand)
print('Bad command reported status of %s' % status)

OS X (Leopard) で実行すると、次の出力が得られます: (これはドキュメントと一致します。)

$ python waitest.py 
Good command reported status of 0
Bad command reported status of 256

OS X では、「ls /fail ; echo $?」を実行します。次の出力を取得します。

$ ls /fail ; echo $?
ls: /fail: No such file or directory
1

Linux (Ubuntu Hardy) で実行すると、次の出力が得られます。

$ python waitest.py 
Good command reported status of 0
Bad command reported status of 512

Ubuntu では、「ls /fail」を実行すると 2 が返されます。

$ ls /fail ; echo $?
ls: cannot access /fail: No such file or directory
2

つまり、Python はステータス コードを 256 倍しているように見えます。これはどこかに文書化されていますか?

4

4 に答える 4

11

osモジュール ( os.WIFCONTINUEDos.WIFSTOPPEDos.WTERMSIGos.WCOREDUMPos.WIFEXITEDos.WEXITSTATUS、 ) には一連の関数がありos.WIFSIGNALEDwait(2)マニュアルos.WSTOPSIGのマクロに対応しています。それらを使用してステータス コードを解釈する必要があります。

たとえば、使用する必要がある終了コードを取得するにはos.WEXITSTATUS(status)

モジュールに切り替えることをお勧めしsubprocessます。

于 2009-10-08T04:54:19.807 に答える
4

わお。それが 256 倍になっているという洞察から、私はそこにたどり着きました。「python コマンド +256」を検索すると、何が起こっているかを説明するPython Module Of The Week の記事にたどり着きました。

そのページのスニペットを次に示します。

関数 getstatusoutput() はシェル経由でコマンドを実行し、終了コードとテキスト出力 (stdout と stderr の組み合わせ) を返します。終了コードは、C 関数の wait() または os.wait() と同じです。コードは 16 ビットの数値です。下位バイトには、プロセスを強制終了したシグナル番号が含まれます。シグナルがゼロの場合、上位バイトはプログラムの終了ステータスです。コア ファイルが生成された場合、下位バイトの上位ビットが設定されます。

Doug のコードの一部:

from commands import *

def run_command(cmd):
    print 'Running: "%s"' % cmd
    status, text = getstatusoutput(cmd)
    exit_code = status >> 8
    signal_num = status % 256
    print 'Signal: %d' % signal_num
    print 'Exit  : %d' % exit_code
    print 'Core? : %s' % bool(exit_code / 256)
    print 'Output:'
    print text
    print

run_command('ls -l *.py')
run_command('ls -l *.notthere')
run_command('echo "WAITING TO BE KILLED"; read input')
于 2009-10-08T04:44:39.707 に答える
3

見てcommands.py

def getstatusoutput(cmd):
    """Return (status, output) of executing cmd in a shell."""
    import os
    pipe = os.popen('{ ' + cmd + '; } 2>&1', 'r')
    text = pipe.read()
    sts = pipe.close()
    if sts is None: sts = 0
    if text[-1:] == '\n': text = text[:-1]
    return sts, text

stsの値が保持されていることがわかりますos.popen(...).close()そのドキュメントを見ると、次os.popen(...).close()の値が返されますos.wait

os.wait()

子プロセスの完了を待ち、その pid と終了ステータス表示を含むタプルを返します: 16 ビットの数値で、その下位バイトはプロセスを強制終了したシグナル番号で、上位バイトは終了ステータスです (シグナルが数はゼロです); コア ファイルが作成された場合は、下位バイトの上位ビットが設定されます。可用性: Unix。

強調は私のものでした。この「エンコーディング」はそれほど直感的ではないことに同意しますが、少なくとも、乗算/ビットシフトされていることは一目で明らかでした。

于 2009-10-08T04:51:46.223 に答える
0

コード検出が間違っていると思います。

「コア ファイルが生成された場合、下位バイトの上位ビットが設定されます。」128を意味します。

だから私はコアラインが

print 'Core? : %s' % bool(status & 128)
于 2009-11-04T17:04:50.213 に答える