Python中os.system()的返回值是多少?

时间:2011-06-24 10:46:52

标签: python operating-system

我遇到了这个:

>>> import os
>>> os.system('ls')
file.txt README
0

os.system()的返回值是多少?为什么我得到0?

6 个答案:

答案 0 :(得分:38)

os.system的返回值取决于操作系统。

在Unix上,返回值是一个16位数字,包含两条不同的信息。来自文档:

  

一个16位数字,其低字节是杀死进程的信号编号,其高字节是退出状态(如果信号编号为零)

因此,如果信号编号(低字节)为0,理论上可以安全地将结果移位8位(result >> 8)以获取错误代码。函数os.WEXITSTATUS就是这样做的。如果错误代码为0,则通常意味着进程退出而没有错误。

在Windows上,文档指定os.system的返回值与shell有关。如果shell是cmd.exe(默认值),则该值是进程的返回码。同样,0意味着没有错误。

对于其他错误代码:

答案 1 :(得分:20)

os.system('command')返回一个16位的数字,左边的前8位(lsb)讨论os用来关闭命令的信号,接下来的8位讨论返回命令的代码。

00000000    00000000
exit code   signal num

示例1 - 命令退出,代码为1

os.system('command') #it returns 256
256 in 16 bits -  00000001 00000000
Exit code is 00000001 which means 1

示例2 - 命令退出,代码为3

os.system('command') # it returns 768
768 in 16 bits  - 00000011 00000000
Exit code is 00000011 which means 3

现在尝试使用信号 - 示例3 - 编写一个长时间休眠的程序,将其用作os.system()中的命令,然后通过kill -15或kill -9

将其杀死
os.system('command') #it returns signal num by which it is killed
15 in bits - 00000000 00001111
Signal num is 00001111 which means 15

你可以有一个python程序作为命令=' python command.py'

import sys
sys.exit(n)  # here n would be exit code

对于c或c ++程序,您可以使用从main()返回或从任何函数退出(n)#

注意 - 这适用于unix

  

在Unix上,返回值是编码进程的退出状态   为wait()指定的格式。请注意,POSIX未指定   C system()函数的返回值的含义,所以返回   Python函数的值取决于系统。

     

os.wait()

     

等待子进程完成,并返回包含其pid和退出状态指示的元组:一个16位数,其   低字节是杀死进程的信号编号,其高位   byte是退出状态(如果信号编号为零);高位   如果生成了核心文件,则设置低字节。

Availability: Unix

答案 2 :(得分:12)

  

“在Unix上,返回值是退出   编码的进程的状态   为wait()指定的格式。注意   POSIX没有指定的含义   C系统的返回值()   函数,所以返回值   Python函数依赖于系统。“

http://docs.python.org/library/os.html#os.system

没有错误,因此退出代码为零

答案 3 :(得分:3)

os.system()返回一些unix输出,而不是命令输出。因此,如果没有错误,则退出代码写为0。

答案 4 :(得分:1)

您可能要使用

return_value = os.popen('ls').read()

相反。 os.system仅返回错误值。

答案 5 :(得分:0)

基于@AlokThakur的答案(谢谢!):

def run_system_command(command):
    return_value = os.system(command)
    # Calculate the return value code
    return_value = int(bin(return_value).replace("0b", "").rjust(16, '0')[:8], 2)
    if return_value != 0:
        raise RuntimeError(f'The system command\n{command}\nexited with return code {return_value}')