zub*_*ber 214 python linux subprocess pipe
我想subprocess.check_output()
用ps -A | grep 'process_name'
.我尝试了各种解决方案,但到目前为止没有任 有人可以指导我怎么做吗?
Tay*_*mon 394
要使用带subprocess
模块的管道,您必须通过shell=True
.
但是,由于各种原因,这并不是真的可取,尤其是安全性.相反,单独创建ps
和grep
处理,并将输出从一个管道传输到另一个,如下所示:
ps = subprocess.Popen(('ps', '-A'), stdout=subprocess.PIPE)
output = subprocess.check_output(('grep', 'process_name'), stdin=ps.stdout)
ps.wait()
Run Code Online (Sandbox Code Playgroud)
但是,在您的特定情况下,简单的解决方案是调用subprocess.check_output(('ps', '-A'))
然后str.find
输出.
jka*_*vas 51
或者,您始终可以在子进程对象上使用communic方法.
cmd = "ps -A|grep 'process_name'"
ps = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output = ps.communicate()[0]
print(output)
Run Code Online (Sandbox Code Playgroud)
communic方法返回标准输出的元组和标准错误.
Alc*_*ive 21
请参阅有关使用子流程设置管道的文档: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]
Run Code Online (Sandbox Code Playgroud)
ana*_*n78 14
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)
Run Code Online (Sandbox Code Playgroud)
小智 5
JKALAVIS解决方案很好,但是我将使用shlex代替SHELL = TRUE进行改进。下面即时查询时间
#!/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)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
198139 次 |
最近记录: |