如何使用`与管道subprocess`命令

问题描述 投票:178回答:6

我想与subprocess.check_output()使用ps -A | grep 'process_name'。我尝试了各种解决方案,但迄今没有奏效。有人可以指导我该怎么办呢?

python linux subprocess pipe
6个回答
377
投票

要使用管道与subprocess模块,你必须通过shell=True

然而,这并不是出于种种原因,不是其中最重要的是安全性实在不可取。取而代之的是,分别创建psgrep过程和管从一个输出到另一个,像这样:

ps = subprocess.Popen(('ps', '-A'), stdout=subprocess.PIPE)
output = subprocess.check_output(('grep', 'process_name'), stdin=ps.stdout)
ps.wait()

你的具体情况,但是,简单的解决方法是调用subprocess.check_output(('ps', '-A')),然后在输出str.find


51
投票

或者,你可以随时使用的子对象的沟通方法。

cmd = "ps -A|grep 'process_name'"
ps = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output = ps.communicate()[0]
print output

该通信方法返回标准输出和标准误差的一个元组。


20
投票

有关使用子进程建立一个管道的文档:http://docs.python.org/2/library/subprocess.html#replacing-shell-pipeline

我没有测试过下面的代码示例,但应大致你想要什么:

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]

3
投票

您可以尝试在sh.py管道的功能:

import sh
print sh.grep(sh.ps("-ax"), "process_name")

3
投票

另外,尽量使用'pgrep'命令来代替'ps -A | grep 'process_name'


3
投票

JKALAVIS的解决方案是好的,但我想补充的改善,而不是SHELL = TRUE的使用shlex。下面IM grepping了查询时间

#!/bin/python
import subprocess
import shlex

cmd = "dig @8.8.4.4 +notcp www.google.com|grep 'Query'"
ps = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output = ps.communicate()[0]
print output

干杯,

© www.soinside.com 2019 - 2024. All rights reserved.