2015-06-22 84 views
2

如何将bash命令的输出放到Python变量中?如何将bash命令的输出放到Python变量中?

我写一个Python脚本,我想进入 bash命令的输出: rpm -qa --qf '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH} %{VENDOR}\n' | grep -v 'Red Hat'|wc -l,并将它放置在Python变量,让说R

之后,我想要做的,Python if R != 0 然后运行一些Linux命令。 我该如何做到这一点?

+0

你真的需要通过一个python脚本。也许只有bash足够。你的问题不是很清楚,你可以添加一些关于你的python脚本的更多细节。 –

回答

2

有多种方案,但最简单的可能使用subprocess.check_output()shell=True虽然这可能是安全隐患,如果你不完全控制哪些命令被传入。

import subprocess 
var = subprocess.check_output('rpm -qa --qf '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH} %{VENDOR}\n' | grep -v 'Red Hat'|wc -l', shell = True) 
var = int(var) 

您需要使用shell=True作为否则管道将不会被解释。

如果您需要更多的控制,你可能想看看plumbum在这里你可以这样做:

from plumbum.cmd import rpm, grep, wc 

chain = rpm["-qa", "--qf", r"%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH} %{VENDOR}\n"] | grep["-v", "Red Hat"] | wc["-l"] 
R = int(chain()) 

虽然我可能不会援引wc得到全部输出和计数其蟒蛇内长度(以便于检查你得到的只是你期望的行数,通过wc -l排除所有细节)

0

我会推荐envoy,主要是因为API对于90%的用例来说更直观。

r = envoy.run('ls ', data='data to pipe in', timeout=2) 
print r.status_code # returns status code 
print r.std_out # returns the output. 

查看Envoy Github页面了解更多详情。

-1

你可以使用stdin。

#!/usr/bin/python 

import sys 

s = sys.stdin.read() 
print s 

然后,你将用popen运行bash命令这样

echo "Hello" | ./myscript.py 

输出

Hello 
0

您可以replace shell pipeline

from subprocess import PIPE,Popen 

p1 = Popen(["rpm", "-qa", "--qf", '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH} %{VENDOR}\n'],stdout=PIPE) 

p2 = Popen(["grep", "-v", 'Red Hat'],stdin=p1.stdout,stdout=PIPE) 
p1.stdout.close() 

p3 = Popen(["wc", "-l"],stdin=p2.stdout,stdout=PIPE) 
p2.stdout.close() 
out,err = p3.communicate() 

如果你只是想检查如果grep返回任何匹配,那么f orget的厕所 - 1,只是检查什么的grep回报:

p1 = Popen(["rpm", "-qa", "--qf", '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH} %{VENDOR}\n'],stdout=PIPE) 

p2 = Popen(["grep", "-v", 'Red Hat'],stdin=p1.stdout,stdout=PIPE) 
p1.stdout.close() 
out,err = p2.communicate() 
if out: 
    ... 

或者只是使用check_output运行rpm命令和检查"Red Hat"字符串:

out = check_output(["rpm", "-qa", "--qf", '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH} %{VENDOR}\n']) 

if "Red Hat" not in out: 
    .... 

这是相同的反向搜索与grep -v然后检查是否有任何与wc匹配。

相关问题