2014-07-02 16 views
5

i ein einfaches Python-Programm, das ich verwende mit Subprozesse zu testen asyncio:Python Asyncio subprocess nie beendet

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

des Lauf auf der Kommandozeile die gewünschten Ergebnisse liefert.

Wenn jedoch aus asyncio genannt, es endet nie

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 zeigt dieser Prozess <defunct> ist, nicht sicher, was das bedeutet

+0

Was Sie geschrieben haben, ist kein gültiger Python-Code. – Bakuriu

Antwort

9

ich Ihr Problem vermuten nur, wie verwandt Sie anrufen asyncio.create_subprocess_exec und process.communiate(). Das komplette Beispiel funktioniert gut für mich:

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

Sie haben den Code zu platzieren, die yield from innerhalb eines asyncio.coroutine verwendet, und es dann in einer Ereignisschleife aufrufen (mit loop.run_until_complete), denn es ist die Art und Weise verhalten Sie es wollen zu.

+0

Danke deine Antwort brachte mich auf den richtigen Weg – leech