我正在尝试使用以下CLI命令在python中工作。
pgrep fmserverd fmserver_helperd fmslogtrimmer fmxdbc_listener | wc -l </ p>
返回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
如果我在文件中编写程序,我基本上会得到相同的结果。此代码使用try catch块保护check_output,输出如下所示:
sp.check_output: ['pgrep', 'fmserver_helperd', '|', 'wc', '-l'] ro: True sh: True out:
usage: pgrep [-Lfilnoqvx] [-d delim] [-F pidfile] [-G gid]
[-P ppid] [-U uid] [-g pgrp]
[-t tty] [-u euid] pattern ...
DoSubProcess exception: Command '['pgrep', 'fmserver_helperd', '|', 'wc', '-l']' returned non-zero exit status 2
我真的很坚持这一点,非常感谢你的帮助。 TY
答案 0 :(得分:3)
如果您想将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
。