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
;如果尚未 exec
uted 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
。
我尝试使用 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
;如果尚未 exec
uted 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
。