os.system
的返回值取决于操作系统。
在 Unix 上,返回值是一个包含两个不同信息的 16 位数字。从文档中可以看到:
一个 16 位数字,其低字节是杀死进程的信号编号,高字节是退出状态(如果信号编号为零)
因此,如果信号编号(低字节)为0,则理论上安全的方式是将结果右移8位 (result >> 8
) 以获取错误代码。函数os.WEXITSTATUS
正好做到了这一点。如果错误代码为0,则通常表示进程已经正常退出,没有错误发生。
在 Windows 上,文档指定 os.system
的返回值取决于 shell 程序。如果使用的是 cmd.exe
(默认的),则该值是进程的返回码。同样,0 表示没有发生错误。
有关其他错误代码的详细信息:
os.WEXITSTATUS(os.system(command))
来获取退出状态。 - brandonesos.system('command')
返回一个16位数字,其中从右边(最低有效位)开始的前8位表示操作系统用于关闭命令的信号,接下来的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
os.system('command') # it returns 768
768 in 16 bits - 00000011 00000000
Exit code is 00000011 which means 3
os.system('command') #it returns signal num by which it is killed
15 in bits - 00000000 00001111
Signal num is 00001111 which means 15
import sys
sys.exit(n) # here n would be exit code
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.
os.wait()
Wait for completion of a child process, and return a tuple containing its pid and 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.
Availability: Unix
.
os.WEXITSTATUS(os.system(my_call))
获取返回代码。例如,sys.exit(os.WEXITSTATUS(os.system('exit 2')))
将以状态码2退出。 - brandones你可能希望使用
return_value = os.popen('ls').read()
相反,os.system
只返回错误值。
os.popen
是一个更整洁的包装器,用于 subprocess.Popen
函数,正如在 Python 源代码中所看到的那样。
os.system
文档中明确指导的疯狂替代方案是改用subprocess
。 - tripleeeos.system() 返回的是一些 Unix 输出,而不是命令输出。因此,如果没有错误,则退出代码写为 0。
这段代码检查系统中是否存在该命令。它使用一个名为command
的shell内置程序来实现这个目的。还有一个名为hash
的内置程序,但在检查执行速度后,我确定command
更快:
if os.system("command -v command_name_here") == 0: ...
os.system("ls")
用于运行一个命令,只关心它是否运行。如果你想要 stdout 输出,可以使用类似commands.getstatusoutput("ls")[1]
的东西,如此定义:https://docs.python.org/2/library/commands.html - Eric Leschinskios.system("ls")
会输出ls
的结果,除非你采取其他措施。我不确定在这种情况下是否想要抑制额外的输出,但如果你确实想要这样做,一种方法是os.system("ls > /dev/null 2>&1")
。 - Christos Haywardos.system
的文档明确建议您避免使用它,而改用subprocess
。有一个函数可以运行命令并返回其结果代码(subprocess.call
),还有一个函数可以检索命令的输出(subprocess.check_output
),以及一个在命令失败时会失败的函数(subprocess.check_call
)。还有一个现代化的高级函数subprocess.run
可以执行所有这些操作,甚至更多。 - tripleee