我可以使用以下代码实时捕获由{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()
这很有效。但是,我现在使用下面的代码运行多个进程,因此我需要将stdout捕获到每个进程的文件中:
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 :(得分:1)
每次调用时都将新文件对象传递给subprocess.Popen
。这允许您将stdout
转移到每个进程的单独文件中。这是一个例子
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()
当我运行时,我得到3个单独的文件
ericu@eric-phenom-linux:~/Documents$ python write_multiple_proc_to_file.py
ericu@eric-phenom-linux:~/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
ericu@eric-phenom-linux:~/Documents$ cat stdout_*.txt
A Message from process #0
A Message from process #1
A Message from process #2
ericu@eric-phenom-linux:~/Documents$
答案 1 :(得分:0)
Popen的stdin和stdout参数接受文件对象,所以你可以在那里传递打开的文件。
来自the docs:
stdin,stdout和stderr指定执行程序的标准 输入,标准输出和标准错误文件句柄。 有效值是PIPE,现有文件描述符(正数 整数),现有文件对象,无。 PIPE表示新的 应该创建给孩子的管道。 [...]