run subproc.py from exec.py and capture its stdout/stderr, good for writing a wrapper script
just run the following:
python exec.py subproc.py 10
__author__ = 'leonmax' | |
import asyncio | |
from asyncio import (coroutine, subprocess) | |
import sys | |
import logging | |
FORMAT = '%(asctime)s - %(name)s - %(levelname)s - %(message)s' | |
logging.basicConfig(level=logging.INFO, format=FORMAT) | |
@coroutine | |
def log_stream(level, stream): | |
while not stream.at_eof(): | |
data = yield from stream.readline() | |
line = data.decode('ascii').rstrip() | |
logging.log(level, line) | |
@coroutine | |
def execute(command, *argument): | |
proc = yield from asyncio.create_subprocess_exec(command, *argument, | |
stdout=subprocess.PIPE, | |
stderr=subprocess.PIPE) | |
tasks = [asyncio.async(log_stream(logging.INFO, proc.stdout)), | |
asyncio.async(log_stream(logging.ERROR, proc.stderr)), | |
asyncio.async(proc.wait())] | |
yield from asyncio.wait(tasks) | |
if __name__ == "__main__": | |
loop = asyncio.get_event_loop() | |
loop.run_until_complete(execute(sys.executable, *sys.argv[1:])) | |
loop.close() |
__author__ = 'leonmax' | |
from asyncio import coroutine, sleep, get_event_loop | |
import sys | |
@coroutine | |
def run(times): | |
for i in range(times): | |
print("trust me ", i) | |
yield from sleep(1) | |
print("I blew it", file=sys.stderr) | |
yield from sleep(1) | |
if __name__ == "__main__": | |
loop = get_event_loop() | |
times = int(sys.argv[1]) if len(sys.argv) > 1 else 10 | |
loop.run_until_complete(run(times)) | |
loop.close() |