2011-05-24 34 views
2

我使用外部庫運行,像這樣的節目的標準錯誤:如何重定向正在使用使用os.system由第三方Python庫

from some_lib import runThatProgram 

infile = '/tmp/test' 
outfile = '/tmp/testout' 
runThatProgram(infile, outfile) 

而runThatProgram是:

def runThatProgram(infile, outfile): 
    os.system("%s %s > %s" % ('thatProgram', infile, outfile)) 

問題是'thatProgram'在STDERR上返回很多東西,我想將它重定向到一個文件,但我無法編輯runThatProgram代碼,因爲它在第三方lib!

+1

您應該避免使用那些爲易碎的和不安全的東西庫。 – 2011-05-24 14:13:23

+1

你爲什麼不使用子流程?在調用'subprocess.Popen()'參數'stderr'到你想要重定向到的文件描述符時,你可以設置子進程。 – mouad 2011-05-24 14:40:16

+0

Rosh,相信我,在這個庫上獨立於我的TODO列表上:-) – jan 2011-05-24 20:09:41

回答

2

爲了說明什麼猶太矛盾修飾法說,你可以破解這樣的代碼:

from some_lib import runThatProgram 

infile = '/tmp/test' 
outfile = '/tmp/testout 2>&1' 
runThatProgram(infile, outfile) 

這一點,它會調用

thatProgram /tmp/test > /tmp/testout 2>&1 

,將重定向標準錯誤(2)到stdout(1 ),並且所有內容都將記錄在您的outfile中。

+0

這太棒了!我做了小修改'2>/dev/null',因爲runThatProgram需要原始格式的標準輸出,並且確實有效! – jan 2011-05-24 20:08:48

0

爲了詳細說明使用subprocess,你可以打開它,給它一個管道,然後從工作有這麼

import subprocess 
program = "runthatprogram.py".split() 
process = subprocess.Popen(program, stdout = subprocess.PIPE, stderr = open('stderr','w')) #stderr to fileobj 
process.communicate()[0] #display stdout