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.popen
是subprocess.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() 的返回值是啥?的主要内容,如果未能解决你的问题,请参考以下文章
pythonos.system() & os.popen() 在 python 执行 cmd 指令
python 使用 os.system() 时没有返回正常的结果,返回了256 ubuntu16.04系统下 python版本 2.7.11