2014-07-02 42 views
5

我有我使用测试ASYNCIO与子过程的简单的Python程序:在命令行上运行这将产生所期望的结果的Python ASYNCIO子过程从未完成

import sys, time 
for x in range(100): 
    print("processing (%s/100) " % x) 
    sys.stdout.flush() 
print("enjoy") 
sys.stdout.flush() 

然而,从ASYNCIO调用时,它永远不会结束

process = yield from asyncio.create_subprocess_exec(
    *["python", "program.py"], 
    stdout=async_subprocess.PIPE, 
    stderr=async_subprocess.STDOUT, 
    cwd=working_dir 
) 

# this never finishes 
yield from process.communicate() 

ps ax展示了这个过程是<defunct>,不知道这意味着什么

+0

你写的东西不是有效的Python代码。 – Bakuriu

回答

9

我怀疑你的问题只是涉及到你如何调用asyncio.create_subprocess_execprocess.communiate()。这个完整的例子,我工作得很好:

import asyncio 
from asyncio import subprocess 

@asyncio.coroutine 
def do_work(): 
    process = yield from asyncio.create_subprocess_exec(
     *["python", "program.py"], 
     stdout=subprocess.PIPE, 
     stderr=subprocess.STDOUT 
    ) 

    stdout, _= yield from process.communicate() 
    print(stdout) 

if __name__ == "__main__": 
    loop = asyncio.get_event_loop() 
    loop.run_until_complete(do_work()) 

您必须将使用yield from一个asyncio.coroutine的内部代码,然后把它叫做一个事件循环(使用loop.run_until_complete)内,为它的行为方式,你想让它至。

+0

谢谢你的回答让我走上正轨 – leech