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