2014-02-23 35 views
0

我可以使用下面的代碼在實時通過「Popen捕捉的處​​理稱爲輸出:的Python - 捕捉實時多POPEN子進程的標準輸出到文件

p = subprocess.Popen(args, 
        stdout=subprocess.PIPE, 
        stderr=subprocess.PIPE) 

for line in iter(p.stdout.readline,''): 
    sys.stdout.write(line) 

output, error = p.communicate() 

這個偉大的工程。不過,我現在已經使用下面的代碼運行多個進程,所以我需要捕獲標準輸出爲每個進程文件:

for mapped_file in range(1,3): 

    #Fire the command in parallel 
    stdout = open(outfile + '.stdout', 'w') 
    p = subprocess.Popen(args, 
         stdout=subprocess.PIPE, 
         stderr=subprocess.PIPE) 

    stdout_list.append(stdout) 
    process_list.append(p) 

    #for line in iter(p.stdout.readline,''): 
    # stdout.write(line) 

    #Wait for all processes to continue 
    while len(process_list) > 0: 
     for process in process_list: 

     #Loop through the process to wait until all tasks finished 
     if not process.poll() is None: 
      output, error = process.communicate() 

      #Remove the process from the list because it has finished 
      process_list.remove(process) 

     #Sleep for 1 second in between iterations 
     time.sleep(1) 

包括for line in iter(p.stdout.readline,''):...代碼保持僅在第一循環執行代碼。

我怎樣才能將stdout(並且大概是stderr)實時的在我的循環內執行的每個進程捕獲到一個文件中?

+0

你的第一個代碼示例可能死鎖如果子進程將在stderr上產生足夠的輸出的例子

import subprocess procs = [] for p in range(3): args = ['echo',"A Message from process #%d" % p] #Funnel stdout to a file object, using buffering fout = open("stdout_%d.txt" % p,'w') p = subprocess.Popen(args,stdout=fout,bufsize=-1) procs.append(p) #Wait for all to finish for p in procs: p.communicate() 

。如果任何*子進程在stdout *或* stderr上產生足夠的輸出,則第二個代碼示例可能會死鎖。 – jfs

回答

1

每次調用它時都會傳遞一個新的文件對象到subprocess.Popen。這使您可以將stdout轉移到每個進程的單獨文件。這是當我跑,我得到3個單獨的文件

[email protected]:~/Documents$ python write_multiple_proc_to_file.py 
[email protected]:~/Documents$ ls -l stdout_* 
-rw-rw-r-- 1 ericu ericu 26 Feb 23 09:59 stdout_0.txt 
-rw-rw-r-- 1 ericu ericu 26 Feb 23 09:59 stdout_1.txt 
-rw-rw-r-- 1 ericu ericu 26 Feb 23 09:59 stdout_2.txt 
[email protected]:~/Documents$ cat stdout_*.txt 
A Message from process #0 
A Message from process #1 
A Message from process #2 
[email protected]:~/Documents$ 
+0

我需要添加'bufsize'關鍵字才能真正看到實時。謝謝!!!完美的作品。 – Brett

+0

對於'stdout = file' +1。在'Popen()'後面調用'fout.close()'(你不需要在父文件中打開文件)。調用'p.communicate()'沒有意義(不使用'PIPE')。 'p.wait()'在這裏更合適。 – jfs

+1

@Brett:'bufsize'在這裏沒用(沒有使用'PIPE')。 'stdout = file'在文件描述符的級別上工作。 – jfs

0

Popen的stdin和stdout參數接受文件對象,所以你可以在那裏傳遞打開的文件。

the docs來自:

標準輸入,輸出和錯誤指定執行程序的標準 輸入,標準輸出和標準錯誤的文件句柄,分別。 有效值是PIPE,現有文件描述符(整數爲正數 ),現有文件對象和無。 PIPE表示應該創建一個新的管道給孩子。 [...]

相關問題