如何对管道使用“subprocess”命令

2024-04-18 11:21:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我想将subprocess.check_output()ps -A | grep 'process_name'一起使用。 我尝试了各种各样的解决办法,但到目前为止都没有奏效。有人能指导我怎么做吗?


Tags: nameoutputcheckprocessgreppssubprocess指导
1条回答
网友
1楼 · 发布于 2024-04-18 11:21:08

或者始终可以对子流程对象使用communicate方法。

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

communicate方法返回标准输出和标准错误的元组。

网友
2楼 · 发布于 2024-04-18 11:21:08

要将管道与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

网友
3楼 · 发布于 2024-04-18 11:21:08

请参阅有关使用子流程设置管道的文档: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]

相关问题 更多 >