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

Posted

技术标签:

【中文标题】Python 中 os.system() 的返回值是啥?【英文标题】:What is the return value of os.system() in Python?Python 中 os.system() 的返回值是什么? 【发布时间】:2011-09-21 22:37:14 【问题描述】:

我遇到了这个:

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

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

【问题讨论】:

os.system("ls") 用于运行您只关心它是否运行的命令。如果您想要标准输出输出,请使用此处定义的 commands.getstatusoutput("ls")[1] 之类的内容:docs.python.org/2/library/commands.html (但是,如果您不采取其他措施,os.system("ls") 将输出ls 的结果。在这种情况下,我不确定您是否想要抑制附加输出,但如果你这样做了,一种方法是os.system("ls > /dev/null 2>&1") 只是为了说明这一点,os.system 的文档非常明确地建议您避免使用它,而使用 subprocess。有一个函数只运行一个命令并返回其结果代码 (subprocess.call) 和一个从命令中检索输出 (subprocess.check_output) 以及一个在命令失败时失败的函数 (subprocess.check_call)。有一个现代的高级函数 subprocess.run 可以完成这三个功能,甚至更多。 【参考方案1】:

"在Unix上,返回值是出口 编码在进程中的状态 为 wait() 指定的格式。注意 POSIX 没有具体说明 C system() 的返回值 函数,所以返回值 Python 函数依赖于系统。”

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

没有错误,所以退出码为零

【讨论】:

返回代码 os os.wait() 对返回值和终止进程的信号进行编码。见***.com/a/7616227/496127【参考方案2】:

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

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

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

因此,如果信号编号(低字节)为 0,理论上将结果移动 8 位(result >> 8)以获取错误代码是安全的。函数os.WEXITSTATUS 正是这样做的。如果错误码为0,则通常表示进程无错误退出。

在 Windows 上,文档指定 os.system 的返回值取决于 shell。如果shell为cmd.exe(默认),则值为进程的返回码。同样,0 表示没有错误。

对于其他错误代码:

on Linux on Windows

【讨论】:

OS 维护一个 errno 作为变量,该变量具有最近执行的进程的退出状态。 erron是全局的,这个errno值在执行后返回,说明cmd执行成功还是失败 这不是答案,Linux 链接现在没有任何用处。 @SteveBennett 谢谢,我修复了链接。为什么你认为它不符合作为答案的条件?问题是“这个数字是多少”,我给出了答案。 @brandones 感谢您指出这一点。这个答案是很久以前写的,显然缺少重要信息。现在应该是正确的。 固体。很抱歉语气,我刚刚花了一段时间来解决这样的错误。请注意,您可以使用os.WEXITSTATUS(os.system(command)) 获取退出状态。【参考方案3】:

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

【讨论】:

【参考方案4】:

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 程序设置为 command = 'python command.py'

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

如果是 c 或 c++ 程序,您可以使用 main() 的 return 或任何函数的 exit(n) #

注意 - 这适用于 unix

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

os.wait()

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

Availability: Unix

.

【讨论】:

你能发布任何说明这一点的文档或链接吗? @shane 我的答案适用于 unix,我不确定在 windows 上,我在下面提到了 - docs.python.org/2/library/os.html#os.system,它说它的返回将根据系统调用 wait(),然后我提到- docs.python.org/2/library/os.html#os.wait 注意:您可以使用os.WEXITSTATUS(os.system(my_call)) 获取返回码。因此,例如sys.exit(os.WEXITSTATUS(os.system('exit 2'))) 将以状态码 2 退出。【参考方案5】:

你可能想使用

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

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

os.popensubprocess.Popen 函数的更简洁的包装器,如 Python 源代码所示。

【讨论】:

对于os.system 文档中明确说明的指导的另一种疯狂替代方法:改用subprocess @triplee 我认为如果你查看实际 python 代码 (github.com/python/cpython/blob/master/Lib/os.py) 中的 os.popen 函数,你会发现它无论如何都使用 subprocess.Popen。【参考方案6】:

如果你想在命令提示符下存储运行命令的输出 os.system("")

这是一种将输出存储在变量output中的替代方法

# code to execute a command and store it's output in a variable

import subprocess as sp
output = sp.getoutput("whoami")
print(output)

【讨论】:

以上是关于Python 中 os.system() 的返回值是啥?的主要内容,如果未能解决你的问题,请参考以下文章

python os.system()和os.popen()

pythonos.system() & os.popen() 在 python 执行 cmd 指令

python cmd命令调用

python cmd命令调用

python 使用 os.system() 时没有返回正常的结果,返回了256 ubuntu16.04系统下 python版本 2.7.11

python中os.popen, os.system()区别