Python os.popen() returns 运行 进程计数加 1

Python os.popen() returns running process count incremented by 1

我尝试使用 ps 获取进程计数,当我在我的 linux 终端上执行命令时它 returns 正确计数。 但是当我使用 os.popen() 在 python shell 中执行相同的命令时,返回的计数总是递增 one

root@dev:/home/admin# ps -ef | grep some_process | wc -l
1
root@dev:/home/admin# python
Python 2.7.6 (default, Nov 23 2017, 15:49:48) 
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.popen('ps -ef | grep some_process | wc -l').read()
'2\n'
>>> 

os.popen 将启动进程 /bin/sh -c 'ps -ef | grep some_precess | wc -l',这也将被视为符合您的条件的进程。

请尝试在 shell 和 python 中使用 cmd ps -ef | grep some_process | grep -v grep | wc -l,这样您就可以不小心计算到这个已启动的进程

首先,让我们看看 os.popen('ps -ef | grep some_process | wc -l').read() 做了什么。它生成一个 shell,在其参数列表中包含给定的命令行。然后生成三个进程的管道,其中 ps 收集进程列表。在这一点上,至少第一个 shell 和 grep 在他们的参数列表中有 some_process ;如果尚未 executed wc,也可能是第三个管道进程。 grep过滤列表,wc统计结果。请注意,参数甚至在列表中供 grep 查找的唯一原因是 -f 的使用,这可能是多余的,因为 wc 不关心。

这应该清楚为什么有人建议 [s]ome_process;此模式与自身不匹配,并且会排除所有这 2-3 个进程,假设 glob 不起作用。如果碰巧存在名为 some_process 的文件,它需要引号才能工作。

但是,可能还有更可靠的方法。我们已经 运行 一个 Python 进程,所以我们可以很容易地计算事物,并且 ps 已经切换到 select 个特定进程,例如 ps -C some_process 到 select 在命令名称上。因此,一种更具辨别力的任务形式可能是:

subprocess.check_output(["ps", "--no-heading", "-C", "python"]).count(b'\n')

使用man 检查其他相关的命令开关,例如ps