python:os.system的输出不被认为是真/假检查?

时间:2013-06-03 06:01:50

标签: python

所以我已经知道了进程是否正在运行:

os.system("ps aux | grep [my]process")

我使用方括号,所以我也没有得到grep命令。

当我尝试做类似

的事情时
'yes' if os.system("ps aux | grep [my]process") else 'no'

我总是得不到,即使实际上python打印了包含该过程信息的行。

非常肯定我的方面肯定存在某种误解......我假设如果os.system的输出不为零,则表达式解析为true,所以我应该得到'yes'。但这根本不会发生,我得不到,即使进程正在运行,命令也会正确返回有关进程的信息。

我在这里做错了什么?

谢谢!

4 个答案:

答案 0 :(得分:5)

你的逻辑是错误的。当有一些匹配的行时,grep会返回0

无论如何,

使用subprocess模块是个更好的主意。您可以获得ps aux的输出并在程序中检查它。虽然解析ps的输出总是相当脆弱

例如:

import subprocess
'yes' if 'myprocess' in subprocess.check_output(['ps','aux']) else 'no'

答案 1 :(得分:3)

os.system的输出不是屏幕上打印的内容。

  

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

     

在Windows上,返回值是系统shell返回的值   运行命令后,由Windows环境变量给出   COMSPEC:在command.com系统(Windows 95,98和ME)上始终如此   0;在cmd.exe系统(Windows NT,2000和XP)上,这是退出   命令运行的状态;在使用非本机shell的系统上,   请参阅您的shell文档。

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

答案 2 :(得分:1)

使用subprocess.call()subprocess.check_call()

答案 3 :(得分:0)

os.system返回已执行命令的退出状态。如果命令成功,则返回0,否则返回非零数字。例如:

>>> t=os.system("ls")
>>> t
0
>>> t=os.system("lsas")
sh: 1: lsas: not found
>>> t
32512
>>>