2010-01-29 55 views
6
def StartProc(dir, parm): 
    global proc  

    proc_log = open(dir + os.sep + "MyLog.txt","w") #new path for each file 

    if parm: 
     proc = subprocess.Popen(path, 0, None, subprocess.PIPE, proc_log, None) 
    else: 
     MyReset(proc)      #reset the process(proc) to its default values 
     proc.stdout = proc_log   #no effect 
     print "fptr ", proc.stdout 
    #endif 
#enddef 

prm = True 

for i in range(0, 5): 
    StartProc(i, prm) 
    prm = False 
#endfor 

我想要做的只是啓動一個可執行文件一次,但在每次迭代中,我想將進程輸出重定向到一個不同的文件。發生的情況是,文件是在不同的路徑中創建的,但是輸出被重定向到第一次創建的文件。如何重定向一個子進程的標準輸出?

注意:MyReset()在第一次迭代後將進程(可執行文件)初始化爲默認值。

以下行會將進程標準輸出更改爲新文件嗎?

proc.stdout = proc_log 

回答

6

就像展開說的那樣,您不能更改子進程正在將其輸出寫入的文件描述符。

你可以做什麼,是從您的python腳本中的子進程讀取輸出,然後將其寫回到您想要的任何文件。例如:

proc = subprocess.Popen(path, 0, None, subprocess.PIPE, subprocess.PIPE, None) 

for l in proc.stdout.readlines(): 
    output_file.write(l) 

Obivously,你需要弄清楚控制應該如何表現在你的應用程序,即你可以在主線程執行寫入操作的時候應該從StartProc()在這種情況下,主線程返回,或你是否需要從另一個線程進行寫入,以便主線程可以立即從StartProc()返回。

4

你不行。一旦這個過程開始,它的標準輸出就不會從外部改變。你需要進入該進程的空間,以便使用它的文件描述符。

如果你有一種方法(我猜想在MyReset())與正在運行的進程交談,也許你可以設計一種方式來傳遞一個新的文件名,以便(重新)打開它的標準輸出。

1

有微妙的問題/ Python中的bug有關subprocess.PIPE: http://bugs.python.org/issue1652

顯然,這是固定在python3 +,而不是在Python 2.7及以上。爲此,您需要使用: code.google.com/p/python-subprocess32/

相關問題