Pythonsubprocess命令与pipe道
我想用ps -A | grep 'process_name'
来使用subprocess.check_output()
ps -A | grep 'process_name'
。 我尝试了各种解决scheme,但迄今没有任何工作 有人可以指导我如何做到这一点?
要在subprocess
模块中使用pipe道,必须通过shell=True
。
然而,由于各种原因,这并不是真正可取的,尤其是安全性。 相反,分别创buildps
和grep
进程,并将输出从一个input到另一个,如下所示:
ps = subprocess.Popen(('ps', '-A'), stdout=subprocess.PIPE) output = subprocess.check_output(('grep', 'process_name'), stdin=ps.stdout) ps.wait()
然而,在你的特定情况下,简单的解决scheme是调用subprocess.check_output(('ps', '-A'))
,然后在输出上str.find
。
或者你可以在subprocess对象上总是使用通信方法。
cmd = "ps -A|grep 'process_name'" ps = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT) output = ps.communicate()[0] print output
通信方法返回一个元组中的标准输出和标准错误。
请参阅使用子stream程设置pipe道的文档: http : //docs.python.org/2/library/subprocess.html#replacing-shell-pipeline
我还没有testing下面的代码示例,但它应该大致是你想要的:
query = "process_name" ps_process = Popen(["ps", "-A"], stdout=PIPE) grep_process = Popen(["grep", query], stdin=ps_process.stdout, stdout=PIPE) ps_process.stdout.close() # Allow ps_process to receive a SIGPIPE if grep_process exits. output = grep_process.communicate()[0]
另外,尝试使用'pgrep'
命令而不是'ps -A | grep 'process_name'
'ps -A | grep 'process_name'
您可以尝试sh.py中的pipe道function:
import sh print sh.grep(sh.ps("-ax"), "process_name")
你可以试试
check_output(["sh", "-c", "ps", "-A", "|", "grep", "process_name"])
要么
check_output(["bash", "-c", "ps", "-A", "|", "grep", "process_name"])
显示所有进程:
pstree -a
按用户显示:
pstree user