3

我正在使用该subprocess模块来确定进程是否正在运行。但是当查找过程不存在时,结果就不同了。

例如,在shell中,如果进程python test.py不存在,则输出ps -ef|grep python|grep test|awk '{print $2}'为空。但是在python中:

cmd="ps -ef|grep python|grep test|awk '{print $2}'"
vp=subprocess.Popen(cmd,stdout=subprocess.PIPE,shell=True)
r=vp.communicate()[0]

输出r不是无。它是执行的 shell 的 pid cmd

那么如何得到想要的结果呢?

4

1 回答 1

4

当 shell 子进程运行时,它的参数是可见的,ps因为它们作为命令行传递给sh.

shell=True通过调用['/bin/sh', '-c', cmdstring].

当您在 shell 中键入管道时,管道的每个部分都被单独调用,因此没有在其参数中同时包含“python”和“test”的进程。

您的进程树如下所示:

python script.py
    /bin/sh -c "ps -ef|grep python|grep test|awk '{print $2}'"
        ps -ef
        grep python
        grep test
        awk '{print $2}'
于 2012-06-15T10:06:22.230 回答