Pythonでのos.systemの戻り値



Return Value Os





まず、Pythonでのos.system(cmd)の戻り値とlinuxコマンドの戻り値の関係(この記事の追加コンテンツを参照)

誰もがos.systemv()関数を使用してlinuxコマンドを実行することに慣れています。この関数の戻り値は10進数(16ビットの2進数に対応)です。この関数の戻り値と
linuxコマンドの戻り値間の変換関係は次のとおりです。関数の戻り値(10進数)が16の2進数に変換され、上位8ビットがインターセプトされます(下位桁が0の場合)。オペレーティングシステムであるため、下位ビットはすべてゼロです)、次にlinuxコマンドの10進数が0に変換されます。

例えば:



Os.system()は値0を返します。linuxコマンドは値0を返します。

Os.system()は256の値を返します。16桁の2進数は00000001,00000000として表示されます。上位8ビットは10進数に変換されます。対応するlinuxコマンドは値を返します。 1



os.system()の戻り値は512で、16桁の2進数は00000010,00000000として表示され、上位8ビット変換は10進数であり、対応する値はlinuxコマンドの戻り値2です。

...他は同じです...

os.system()の戻り値は32512、16ビットの2進数は01111111,00000000、上位8桁の10進数は127です。対応するlinuxコマンドの戻り値127



問題:/bin/xxx.pyは、戻りコードが1のプログラムです。Pythonプログラムがos.system( './ bin / xxx.py')で呼び​​出された場合、正常に動作した後のos.systemの戻り値問題になり、256、つまり0x100になります。通常のものの代わりに1を返す必要があります。

解決策:見つかったドキュメントを確認してくださいos.system()戻り値は次のとおりです。

On Unix, the return value is the exit status of the process encoded in the format specified for wait().

およびos.wait()戻り値は次のとおりです。

a 16-bit number, whose low byte is the signal number that killed the process, and whose high byte is the exit status (if the signal number is zero)

os.system戻り値はプログラムの実行結果ではありません。ただし、1つ16 bits数値、その上位は戻りコードです。つまり、os.system()戻り値256 0×0100、戻りコードはその高い位置0×01である必要があります1。したがって、プログラム実行出口の値(Cのメイン関数で0を返すなど)を取得するには、それを処理する必要があります。

ret = os.system('./a.out') ret >>= 8

これにより、正しい戻り値が得られます。また、次の点にも注意してください。python取得される値はUnsigned integerであるため、負の値を返すと、出力は大きな正の値になります。たとえば、returning -1、pythonは255-2 then 254などを取得します。
したがって、それが正しいかどうかを判断するのが最善です0大丈夫です。私が書いたcプログラムの戻り値を本当に判断したいので、返すことをお勧めします0,1,2,3同等のエラー戻り-1

さらに、明確な戻り値に遭遇しました。cプログラムのデバッグ情報プロンプトも戻り値を返します0結果python取得は-1そして、cプログラムがいくら戻ってもpython取得-1。後で、cプログラムの問題を調べたところ、それは自分のせいであることがわかりました。pythonプログラム自体は別のCプログラムによって呼び出され、それを呼び出すCプログラムはSIGCLD信号を呼び出します。無視されます(これは、Pythonが子プロセスの終了時に生成された信号に基づいて戻り値を取得していることを示します)、そのCプログラムを使用しますSIGCLD関数にバインドします。その関数が何もしない場合でも、Pythonは取得できます。正しい戻り値。


次に、linuxコマンドの実行後、成功したかどうかに関係なく戻り値があります。

0の場合、コマンドは正常に実行され、他の値はエラーを示します。特定のエラーコードには、次の意味があります。

'OS error code 1: Operation not permitted' 'OS error code 2: No such file or directory' 'OS error code 3: No such process' 'OS error code 4: Interrupted system call' 'OS error code 5: Input/output error' 'OS error code 6: No such device or address' 'OS error code 7: Argument list too long' 'OS error code 8: Exec format error' 'OS error code 9: Bad file descriptor' 'OS error code 10: No child processes' 'OS error code 11: Resource temporarily unavailable' 'OS error code 12: Cannot allocate memory' 'OS error code 13: Permission denied' 'OS error code 14: Bad address' 'OS error code 15: Block device required' 'OS error code 16: Device or resource busy' 'OS error code 17: File exists' 'OS error code 18: Invalid cross-device link' 'OS error code 19: No such device' 'OS error code 20: Not a directory' 'OS error code 21: Is a directory' 'OS error code 22: Invalid argument' 'OS error code 23: Too many open files in system' 'OS error code 24: Too many open files' 'OS error code 25: Inappropriate ioctl for device' 'OS error code 26: Text file busy' 'OS error code 27: File too large' 'OS error code 28: No space left on device' 'OS error code 29: Illegal seek' 'OS error code 30: Read-only file system' 'OS error code 31: Too many links' 'OS error code 32: Broken pipe' 'OS error code 33: Numerical argument out of domain' 'OS error code 34: Numerical result out of range' 'OS error code 35: Resource deadlock avoided' 'OS error code 36: File name too long' 'OS error code 37: No locks available' 'OS error code 38: Function not implemented' 'OS error code 39: Directory not empty' 'OS error code 40: Too many levels of symbolic links' 'OS error code 42: No message of desired type' 'OS error code 43: Identifier removed' 'OS error code 44: Channel number out of range' 'OS error code 45: Level 2 not synchronized' 'OS error code 46: Level 3 halted' 'OS error code 47: Level 3 reset' 'OS error code 48: Link number out of range' 'OS error code 49: Protocol driver not attached' 'OS error code 50: No CSI structure available' 'OS error code 51: Level 2 halted' 'OS error code 52: Invalid exchange' 'OS error code 53: Invalid request descriptor' 'OS error code 54: Exchange full' 'OS error code 55: No anode' 'OS error code 56: Invalid request code' 'OS error code 57: Invalid slot' 'OS error code 59: Bad font file format' 'OS error code 60: Device not a stream' 'OS error code 61: No data available' 'OS error code 62: Timer expired' 'OS error code 63: Out of streams resources' 'OS error code 64: Machine is not on the network' 'OS error code 65: Package not installed' 'OS error code 66: Object is remote' 'OS error code 67: Link has been severed' 'OS error code 68: Advertise error' 'OS error code 69: Srmount error' 'OS error code 70: Communication error on send' 'OS error code 71: Protocol error' 'OS error code 72: Multihop attempted' 'OS error code 73: RFS specific error' 'OS error code 74: Bad message' 'OS error code 75: Value too large for defined data type' 'OS error code 76: Name not unique on network' 'OS error code 77: File descriptor in bad state' 'OS error code 78: Remote address changed' 'OS error code 79: Can not access a needed shared library' 'OS error code 80: Accessing a corrupted shared library' 'OS error code 81: .lib section in a.out corrupted' 'OS error code 82: Attempting to link in too many shared libraries' 'OS error code 83: Cannot exec a shared library directly' 'OS error code 84: Invalid or incomplete multibyte or wide character' 'OS error code 85: Interrupted system call should be restarted' 'OS error code 86: Streams pipe error' 'OS error code 87: Too many users' 'OS error code 88: Socket operation on non-socket' 'OS error code 89: Destination address required' 'OS error code 90: Message too long' 'OS error code 91: Protocol wrong type for socket' 'OS error code 92: Protocol not available' 'OS error code 93: Protocol not supported' 'OS error code 94: Socket type not supported' 'OS error code 95: Operation not supported' 'OS error code 96: Protocol family not supported' 'OS error code 97: Address family not supported by protocol' 'OS error code 98: Address already in use' 'OS error code 99: Cannot assign requested address' 'OS error code 100: Network is down' 'OS error code 101: Network is unreachable' 'OS error code 102: Network dropped connection on reset' 'OS error code 103: Software caused connection abort' 'OS error code 104: Connection reset by peer' 'OS error code 105: No buffer space available' 'OS error code 106: Transport endpoint is already connected' 'OS error code 107: Transport endpoint is not connected' 'OS error code 108: Cannot send after transport endpoint shutdown' 'OS error code 109: Too many references: cannot splice' 'OS error code 110: Connection timed out' 'OS error code 111: Connection refused' 'OS error code 112: Host is down' 'OS error code 113: No route to host' 'OS error code 114: Operation already in progress' 'OS error code 115: Operation now in progress' 'OS error code 116: Stale NFS file handle' 'OS error code 117: Structure needs cleaning' 'OS error code 118: Not a XENIX named type file' 'OS error code 119: No XENIX semaphores available' 'OS error code 120: Is a named type file' 'OS error code 121: Remote I/O error' 'OS error code 122: Disk quota exceeded' 'OS error code 123: No medium found' 'OS error code 124: Wrong medium type' 'OS error code 125: Operation canceled' 'OS error code 126: Required key not available' 'OS error code 127: Key has expired' 'OS error code 128: Key has been revoked' 'OS error code 129: Key was rejected by service' 'OS error code 130: Owner died' 'OS error code 131: State not recoverable'