2017-02-08 94 views
0

我想將以下shell評估轉換爲python2.6(無法升級)。我無法弄清楚如何評估命令的輸出。Python,if語句中的OS命令的評估輸出

這裏的外殼版本:

status=`$hastatus -sum |grep $hostname |grep Grp| awk '{print $6}'` 
if [ $status != "ONLINE" ]; then 
    exit 1 
fi 

我試圖os.popen並返回[ 'ONLINE \ n']。

value = os.popen("hastatus -sum |grep `hostname` |grep Grp| awk '{print $6}'".readlines() 
print value 
+0

所以...這是一樣的嗎? –

+0

shell版本只返回「ONLINE」,os.popen返回「['ONLINE \ n']」。這很好,但我不知道如何對「ONLINE」 – user3931296

+0

進行測試,如果'ONLINE'在值:....' – fedepad

回答

0

嘗試子模塊:

import subprocess 
value = subprocess.call("hastatus -sum |grep `hostname` |grep Grp| awk '{print $6}'") 
print(value) 

文檔可以在這裏找到: https://docs.python.org/2.6/library/subprocess.html?highlight=subprocess#module-subprocess

+0

謝謝,但管道似乎被忽略。該文檔顯示命令和參數([「command」,「args」])我找不到管道等效物。 – user3931296

+0

您可以將shell命令封裝在shell腳本中。那麼這很容易被調用。但是,不確定是否會挫敗你想要做的事情。 –

0

推薦的方法是使用subprocess模塊。
文檔的以下部分是有益的:
replacing shell pipeline
我報告這裏以供參考:

輸出= dmesg | grep hda

變爲:

p1 = Popen(["dmesg"], stdout=PIPE)

p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits.
output = p2.communicate()[0]

開始p2p1.stdout.close()通話是爲了p1p1之前收到SIGPIPE如果p2退出重要。

另外,對於信任的輸入上,外殼本身的管道支架仍可以直接使用:

輸出= dmesg | grep hda

變爲:

output=check_output("dmesg | grep hda", shell=True)

而且這裏是翻譯os.pop的食譜連接到子模塊:
replacing os.popen()

所以你的情況,你可以與上述文件中顯示,這樣做

import subprocess 

output=check_output("hastatus -sum |grep `hostname` |grep Grp| awk '{print $6}'", shell=True) 

串接Popens(可能我會做什麼) 。

再進行試驗,你可以只使用輸出,假設你使用第一種方法:

import sys 
import subprocess 

.... 
if 'ONLINE' in output: 
    sys.exit(1) 
+0

感謝您的幫助。現在對我而言,在殼體中執行操作更爲簡單。 – user3931296