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

我想使用subprocess.check_output()ps -A | grep 'process_name'。 我尝试了各种解决方案,但到目前为止都没用。有人能指导我怎么做吗?< / p >

329918 次浏览

要使用带有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

或者始终可以在子进程对象上使用communication方法。

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

communication方法返回一个由标准输出和标准错误组成的元组。

你可以尝试sh.py中的管道功能:

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

另外,尝试使用'pgrep'命令而不是'ps -A | grep 'process_name'

请参阅使用subprocess: < a href = " http://docs.python.org/2/library/subprocess.html replacing-shell-pipeline " > 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]
command = "ps -A | grep 'process_name'"
output = subprocess.check_output(["bash", "-c", command])

使用subprocess.run中的input,可以将一个命令的输出传递给第二个命令。

import subprocess
    

ps = subprocess.run(['ps', '-A'], check=True, capture_output=True)
processNames = subprocess.run(['grep', 'process_name'],
input=ps.stdout, capture_output=True)
print(processNames.stdout.decode('utf-8').strip())