2016-11-10 89 views
1

我知道這是很簡單的問題,但我不能做,因爲我是新來的蟒蛇如何linux命令輸出重定向到登錄

我有一個shell腳本,產生了放,當你執行onlinux外殼 一般來說,完成劇本需要30-40分鐘。 我在我的Python代碼中使用該腳本。 當我執行我的python腳本(比如說abc.py)時,輸出應該立即重定向到日誌,也應該在屏幕上打印。

EX:test.sh是shell腳本,abc.py是我的python腳本。 我可以test.sh的完整輸出重定向到日誌如下

import logging 
import commands 
logging,basicConfig(filename=abc.log,filemode='w',level=logging.INFO) 
print ("logging started") 
status,output=commands.getstatusoutput(./test.sh) 
logging.INFO(output) 

但這裏有兩個缺點: 1)我要等到test.sh完成在abc.log文件查看輸出,但我想要立即從abc.log中查看輸出結果2)即使我不能立即在屏幕上查看輸出,在這裏我也必須等待它完成。

你能指導一個更好的方式來實現我的目標。

+0

查看[subprocess]模塊中可用的選項(https://docs.python.org/2/library/subprocess.html#module-subprocess)。 – glibdud

回答

0

正如在評論中提到的,subprocess模塊更適合這一點。您必須通過管道讀取數據,然後記錄並打印。

這裏是一個工作示例:

import logging 
import subprocess 

logging.basicConfig(filename='abc.log', filemode='w', level=logging.INFO) 
print("logging started") 
popen = subprocess.Popen('./script.sh', stdout=subprocess.PIPE) 

for line in (s.strip('\n').strip('\r') for s in iter(popen.stdout.readline, "")): 
    logging.info(line) 
    print line 

的代碼條從所述串的端部的\r\n字符,從而使它們不會在日誌或輸出中結束。

+0

嗨,感謝您的回覆,很抱歉回到這麼長時間。 它沒有按照需要工作,我想看到控制檯上的輸出,並應記錄在同一時間登錄,但它等待,直到腳本執行並一次提供輸出。並且它實際上並不工作,所以我添加了shell = True popen = subprocess.Popen('./ script.sh',stdout = subprocess.PIPE,shell = True) –

0

您可以創建一個假的類文件系統

class StdoutLogger(object): 
""" 
Fake file-like stream object that redirects writes to a logger instance. 
""" 
    def __init__(self, logger): 
     self.logger = logger 
    def write(self, buf): 
     self.logger.info(buf.strip()) 
    def flush(self): 
     pass 

現在你的標準輸出重定向到我們的假文件系統

logger = logging.getLogger('stdoutlogger') 
sys.stdout = StdoutLogger(logger) 

現在,即使不完全執行腳本(IE)連在進行中你可以逐行閱讀。