2013-06-13 126 views
3

只是想挑這個你的大腦。我有幾個子進程正在運行,我想將stderr和stdout打印到一個文件中。我到目前爲止已經做到了這一點:蟒蛇日誌stderr和標準輸出到一個文件

def write_to_stderr_log(process): 
    stderr= open("stderr.log", "w") 
    proc_err = process.communicate() 
    print >> stderr, proc_err 
    stderr.close() 

def write_to_stdout_log(process): 
    stdout = open("stdout.log", "w") 
    proc_out = process.communicate() 
    print >> stdout, proc_out 
    stdout.close() 

def logger(): 
    logger = logging.getLogger('error_testing') 
    hdlr = logging.FileHandler('error.log') 
    formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') 
    hdlr.setFormatter(formatter) 
    logger.addHandler(hdlr) 
    logger.setLevel(logging.WARNING) 

    logger.error('We have a problem') 
    logger.debug('debugging') 
    logger.info('some info') 

logger() 
proc = subprocess.Popen(['FastTree -nt test.fasta'], bufsize=512, stdin = None, stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell=True) 

write_to_stderr_log(proc) 
write_to_stdout_log(proc) 

這是做到這一點的最好辦法。如果我有多個進程,我想它會重新編寫日誌文件,所以這可能是一個問題。在此欣賞一些建議。由於

+0

@nrpeterson這一個是關於重定向子進程的輸出 –

+0

啊,你有一點。我很抱歉! –

回答

0

我敢肯定,你可以到subprocess.Popen提供自己的file實例作爲關鍵字。

>>> out = open('stdout.log', 'wb') 
>>> err = open('stderr.log', 'wb') 
>>> child = subprocess.Popen('FastTree -nt test.fasta', stdin=None, stdout=out, 
          stderr=err) 
>>> rc = child.wait() 
>>> out.close() 
>>> err.close() 

這裏是一個重要的subprocess.Popen文件的部分:指定執行程序的標準輸入,標準輸出和標準錯誤的文件句柄

標準輸入標準輸出標準錯誤,分別。有效值是PIPEDEVNULL,現有的文件描述符(正整數),一個現有的文件對象,和NonePIPE表示應該創建一個新的管道給孩子。 DEVNULL表示將使用專用文件os.devnull。使用默認設置None,不會發生重定向;孩子的文件句柄將從父類繼承。此外,stderr可以是STDOUT,其指示從應用程序的數據stderr應該捕獲到相同的文件句柄作爲stdout

+0

這沒有奏效。如果我在「FastTree」子進程中引入錯誤,則不會將任何內容輸出到stderr.log文件中。 – bioinf80

+0

嘗試添加'shell = True',儘管我懷疑這會產生任何效果。 –

相關問題