2014-07-02 18 views
5

Ho un programma python semplice che sto usando per testare asyncio con sottoprocessi:Python Asyncio sottoprocesso non finisce

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

L'esecuzione di questo sulla riga di comando produce i risultati desiderati.

Tuttavia, quando viene chiamato da asyncio, che non finisce mai

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 mostra questo processo è <defunct>, non è sicuro che cosa significa

+0

Quello che hai scritto non è un codice Python valido. – Bakuriu

risposta

9

ho il sospetto il problema è solo legato a come si sta chiamando asyncio.create_subprocess_exec e process.communiate(). Questo esempio completo funziona bene per me:

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()) 

devi mettere il codice che utilizza yield from all'interno di un asyncio.coroutine, e quindi chiamare all'interno di un ciclo di eventi (usando loop.run_until_complete), perché comportarsi il modo in cui si desidera a.

+0

Grazie per la tua risposta mi ha fatto sulla buona strada – leech

Problemi correlati