2015-06-22 110 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匹配。

相關問題