Python 所有进程都在运行吗

Python 所有进程都在运行吗,python,subprocess,Python,Subprocess,我正在尝试让下面的CLI命令在python中工作 pgrep fmserverd fmserver_helperd fmslogtrimmer fmxdbc_侦听器| wc-l 返回4表示所有4个进程都在运行。这在CLI中工作正常,但在Python中无法正常工作。我使用命令行中的一个进程执行以下操作: import subprocess print subprocess.check_output ([ 'pgrep', 'fmserver_helperd', '|', 'wc', '-l'],

我正在尝试让下面的CLI命令在python中工作

pgrep fmserverd fmserver_helperd fmslogtrimmer fmxdbc_侦听器| wc-l

返回4表示所有4个进程都在运行。这在CLI中工作正常,但在Python中无法正常工作。我使用命令行中的一个进程执行以下操作:

import subprocess
print subprocess.check_output ([ 'pgrep', 'fmserver_helperd', '|', 'wc', '-l'], shell=True, stderr=subprocess.PIPE)
or
print subprocess.check_output ([ 'pgrep', 'fmserver_helperd', '|', 'wc', '-l'], shell=True)
返回:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 573, in check_output
raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command '['pgrep', 'fmserver_helperd', '|', 'wc', '-l']' returned non-zero exit status 2

我真的被这件事缠住了,非常感谢你的帮助。TY

如果您想在管道中使用
shell=True
,以安全可靠的方式(防止shell注入攻击)执行此操作可能如下所示:

def count_instances(progname):
    return int(subprocess.check_output(['pgrep "$1" | wc -l', '_', progname], shell=True))
请注意,我们将传递一个有效的shell脚本作为列表的第一个元素。第二个元素是脚本的
$0
(我们在其中传递一个占位符);第三种是
$1


但是,当您可以运行时,这不是特别好的做法:

def count_instances(progname):
    return subprocess.check_output(['pgrep', progname]).count('\n')

…它根本不需要
shell=True

如果您想将
shell=True
与管道一起使用,以安全可靠的方式(防止shell注入攻击)执行此操作可能如下所示:

def count_instances(progname):
    return int(subprocess.check_output(['pgrep "$1" | wc -l', '_', progname], shell=True))
请注意,我们将传递一个有效的shell脚本作为列表的第一个元素。第二个元素是脚本的
$0
(我们在其中传递一个占位符);第三种是
$1


但是,当您可以运行时,这不是特别好的做法:

def count_instances(progname):
    return subprocess.check_output(['pgrep', progname]).count('\n')

…它根本不需要
shell=True

是shell的指令,而不是pgrep的参数。将该指令放在命令行上会告诉shell运行多个程序——因此要正确模拟它,您需要创建多个
Popen
对象。这就是为什么我使用shell=True。当这被包括在内时,我认为整个事情都是作为一个命令发出的?…并且当您传递带有列表的
shell=True
时,只有列表的第一个元素被该shell视为脚本。所以shell只是运行一个只包含
pgrep
的脚本。为什么在这里
wc-l
而不是仅仅计算本机Python中的输出行数呢?我在键入这个时就想到了这一点,但子流程太奇怪了,我想我应该发布这个问题并在这个过程中学习一些东西。如果CLI部分能够处理它,我会更容易。请在我尝试后马上回复您。
|
是shell的指令,而不是pgrep的参数。将该指令放在命令行上会告诉shell运行多个程序——因此要正确模拟它,您需要创建多个
Popen
对象。这就是为什么我使用shell=True。当这被包括在内时,我认为整个事情都是作为一个命令发出的?…并且当您传递带有列表的
shell=True
时,只有列表的第一个元素被该shell视为脚本。所以shell只是运行一个只包含
pgrep
的脚本。为什么在这里
wc-l
而不是仅仅计算本机Python中的输出行数呢?我在键入这个时就想到了这一点,但子流程太奇怪了,我想我应该发布这个问题并在这个过程中学习一些东西。如果CLI部分能够处理它,我会更容易。请在我尝试后稍后再与您联系。或者只需
count('\n')
获取行数(保存拆分)@Jean-Françoisfare,nod--区别在于如果我们的输出无效且没有尾随换行符,但pgrep不应出现这种情况。是的,这是一个关于文件最后一行是否以换行符结尾的争论:这是一行吗?:)根据您的建议进行修改。:)我仍然不明白为什么OP命令会失败(我不会使用shell=True&pipe,但仍然…),或者只是
count('\n')
来获取行数(保存拆分)@Jean-Françoisfare,nod——区别在于如果我们的输出无效,没有尾随的换行符,但pgrep不应该出现这种情况。是的,这是一个关于文件最后一行是否以换行符结尾的争论:这是一行吗?:)根据您的建议进行修改。:)我仍然不理解OP命令失败的原因(我不会使用shell=True&pipe,但仍然…)