从PIPE读取子进程非阻塞

时间:2014-06-15 12:49:19

标签: python subprocess pipe

我有一个程序,需要几个小时才能完成,并且必须集成到现有程序中。我有一个脚本通过子进程模块运行程序,这很好。但是没有办法说出该计划取得了多大进展。该程序确实向stdout输出了一些实时信息,所以我想我可以通过管道读取来做一些事情。

但是我无法正常工作。看来我的脚本实时阻止了从管道读取。

我制作了一个简单的脚本来证明这一点:

import subprocess

worklist = [
    {
        'name' : '1: ',
        'cmd'     :r'/python27/python.exe printer.py',
        'pid'     :None
    },{
        'name' : '2: ',
        'cmd'     :r'/python27/python.exe printer.py',
        'pid'     :None
    },{
        'name' : '3: ',
        'cmd'     :r'/python27/python.exe printer.py',
        'pid'     :None
    }
]

for work in worklist:
    work['pid'] = subprocess.Popen(work['cmd'], stdout=subprocess.PIPE, stderr=subprocess.PIPE,bufsize=0)


while True:
    for work in worklist:
        for line in work['pid'].stdout:
            print work['name'] + str(line)

    if all(item['pid'].poll() is not None for item in worklist):
        break

for work in worklist:
    work['pid'].communicate

printer.py包含:

from time import sleep
print 'this is a process line 1'
sleep(1)
print 'this is a process line 2'
sleep(1)
print 'this is a process line 3'
sleep(1)
print 'this is a process line 4'
sleep(1)
print 'this is a process line 5'
sleep(1)
print 'this is a process line 6'
sleep(1)
print 'this is a process line 7'
sleep(1)
print 'this is a process line 8'
sleep(1)
print 'this is a process line 9'
sleep(1)

所以我希望看到的是它打印出每个&printer; printer.py'的输出。我实时打电话。然而,它只是在完成整个过程后同时将它打印出来。

通过仅使用子进程模块或其他python内置存在来解决这个问题吗?

我在Windows机器上,所以我不能使用pexpect,因为这将不得不在很多系统上使用我不想引入依赖关系...或者至少一点点

0 个答案:

没有答案