前言
①在实际开发过程中,经常会遇到在Python代码中调用shell脚本,再获取脚本返回的返回值的情况: os.system(cmd)
②由于系统环境的问题, os.system(cmd) 函数执行命令后的返回值在windows和Linux平台上不同。
③对于windows操作系统,os.system(cmd) 函数执行命令后的返回值就是命令执行后的退出状态码。
④对于Linux操作系统, os.system(cmd) 函数执行命令后的返回值即命令执行后的退出状态码是经过编码的,该函数的返回值与 linux命令返回值两者的转换关系为:该函数的返回值(十进制)转化成16二进制数,截取其高八位(如果低位数是0的情况下,有关操作系统的错误码共 131个,所以低位都是零),然后转乘十进制数即为 linux命令返回值0。
⑤一个字节(Byte)是8位(bit),其中的“8位”指的是8位2进制数。一个int类型的变量能存放4Byte,也就是能存放32bit二进制数,而一个32位二进制数中权值最大的8位就是高8位,举个例子:1111000010101010,那么前面的11110000就是高八位,后面的10101010就是低八位。
⑥高八位和低八位:内存里,一个单元是一个字节,也就是8位。如果是16位的指令,就是同时操作连续的2个内存地址,将这连续的2个内存地址当成一个单位,所以就有高8位和低8位之分。
⑦即在Linux操作系统中: os.system(cmd) 函数的返回值并不是执行程序的返回结果。而是一个16位的数,它的高位才是返回码。比如: os.system(cmd) 返回256即 0×0100,返回码应该是其高位0×01即1。
⑧在Linux操作系统中使用Python工具执行命令的时候可以使用Python中的 sbuprocess 内置模块,其函数的返回值与Linux执行程序的返回结果相同。
例如:
1、exit error code:1
2、exit error code:2
示例
Linux操作系统下:
import os # ping 本地网段 网关IP地址 result1 = os.system('ping -c 1 192.168.80.1 > /dev/null') print('ping 192.168.80.1 command error code is', result1)
""" output: ping 192.168.80.1 command error code is 0 """ # ping 其他网段 网关IP地址 result2 = os.system('ping -c 1 192.168.1.1 > /dev/null') print('ping 192.168.1.1 command error code is', result2)
""" output: ping 192.168.1.1 command error code is 256 """
Windows操作系统下:
import os # ping 本地网段 网关IP地址 result1 = os.system('ping -c 1 192.168.80.1 > /dev/null') print('ping 192.168.80.1 command error code is', result1) """ output: ping 192.168.80.1 command error code is 0 """ # ping 其他网段 网关IP地址 result2 = os.system('ping -c 1 192.168.1.1 > /dev/null') print('ping 192.168.1.1 command error code is', result2) """ output: ping 192.168.1.1 command error code is 1 """
查看os模块下的system函数的python在线手册如下:
os.system(command)
Execute the command (a string) in a subshell. This is implemented by calling the Standard C function system(), and has the same limitations. Changes to sys.stdin, etc. are not reflected in the environment of the executed command. If command generates any output, it will be sent to the interpreter standard output stream.
On Unix, the return value is the exit status of the process encoded in the format specified for wait(). Note that POSIX does not specify the meaning of the return value of the C system() function, so the return value of the Python function is system-dependent.
On Windows, the return value is that returned by the system shell after running command. The shell is given by the Windows environment variable COMSPEC: it is usually cmd.exe, which returns the exit status of the command run; on systems using a non-native shell, consult your shell documentation.
简单总结一下:
os.system('cmd')的功能是在子shell中将cmd字符串作为作为命令执行,cmd命令执行后产生的任何输出将被发送到命令解释器的标准输出流。同时状态返回码也将输出到解释器标准输出流。但值得注意的是:返回状态码在windows和linux下的意义不同,对于windows,返回值就是命令执行后的退出状态码,而linux平台上,从上面的手册描述来看,退出状态码是经过了编码的,编码构成如下:
exit status indication: 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); the high bit of the low byte is set if a core file was produced.
也就是说,linux平台上返回值(10进制)需转换为16位二进制数,也就是2个字节,高字节代表退出码。因此,将高字节对应的十进制数才是命令执行后的退出码。
就拿前面的退出码256来说:
os.system('cmd')返回值为0 linux命令返回值也为0.
os.system('cmd')返回值为256,对应二进制数为:00000001 00000000,高八位对应十进制为1,因此 linux命令返回值 1
实例
环境前提:Linux操作系统中
1、当 os.system(cmd) 函数的返回值为0:对应的Linux命令返回值也为0。
2、当 os.system(cmd) 返回值为256(十六位二进制数示为:00000001,00000000,高八位转乘十进制为 1):对应的Linux命令返回值为1。
3、当 os.system(cmd) 返回值为512(十六位二进制数示为:00000010,00000000,高八位转乘十进制为 2):对应的Linux命令返回值为2。
4、当 os.system(cmd) 返回值为32512(十六位二进制数示为:01111111,00000000,高八位转乘十进制为 127):对应的Linux命令返回值为127。
其他
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"
标签:code,python,os,cmd,system,error,返回值,OS From: https://www.cnblogs.com/hls-code/p/16968569.html