Am Donnerstag, 23. Januar 2014 16:48:46 UTC+1 schrieb Guido van Rossum:

Read the source code of asyncio/streams.py. There are helper classes 
> that should let you do it. Please post the solution here.
> -- 
> --Guido van Rossum (python.org/~guido) 
>
 i’m deep inside that source for some hours now, but since i never did 
multiple inheritance, only your comment convinced me that i can ideed marry 
SubprocessProtocol and a StreamReaderProtocol.

import sysfrom functools import partialfrom asyncio.protocols import 
SubprocessProtocolfrom asyncio.streams import StreamReader, StreamReaderProtocol

cmd = […]
@coroutinedef do_task(msg):
    loop = get_event_loop()
    reader = StreamReader(float('inf'), loop)

    transport, proto = yield from loop.subprocess_exec(
        partial(StdOutReaderProtocol, reader, loop=loop), *cmd)

    stdin = transport.get_pipe_transport(0)
    stdin.write(msg)
    stdin.write_eof()  # which of those is actually necessary? only eof? only 
close?
    stdin.close()

    while True:  # would be nice to do “for line in iter(reader.readline, 
b'')”, but not possible with coroutines
        line = yield from reader.readline()
        if not line:
            break
        do_something_with(line)
class StdOutReaderProtocol(StreamReaderProtocol, SubprocessProtocol):
    def pipe_data_received(self, fd, data):
        if fd == 1:
            self.data_received(data)
        else:
            print('stderr from subprocess:', data.decode(), file=sys.stderr, 
end='')

that was completely strange, though. imho there should be a easier way to 
do it instead of figuring this one out.

thanks for your encouragement!

– Phil

Reply via email to