我有一个读取输入和写入输出的过程,例如doubler:(实际上是一个黑匣子,输入和输出完全独立)
#!/bin/bash
while read -r i; do
sleep 0.$RANDOM
echo $((i*2))
done
以及我的Python代码中的一些函数以异步方式提供了该过程:
import asyncio
import subprocess
import random
class Feeder:
def __init__(self):
self.process = subprocess.Popen(['doubler.sh'],
stdin=subprocess.PIPE)
def feed(self, value):
self.process.stdin.write(str(value).encode() + b'\n')
self.process.stdin.flush()
feeder = Feeder()
async def feed_random():
while True:
feeder.feed(random.randint(0, 100))
await asyncio.sleep(1)
async def feed_tens():
while True:
feeder.feed(10)
await asyncio.sleep(3.14)
async def main():
await asyncio.gather(
feed_random(),
feed_tens(),
)
if __name__ == '__main__':
asyncio.run(main())
这很好。但我也想阅读该过程的输出,如下所示:
...
stdout=subprocess.PIPE
...
for line in feeder.process.stdout:
print("The answer is " + line.decode())
但是这很困难,因此不会发生喂食。可以在相同的
stdout
,您必须切换到asyncio.subprocess
。