我需要将数据写入我创建的进程。由于各种原因, 为multiprocessing.Process
。假设此过程执行类似于运行apt upgrade
的操作,然后将提示用户输入[Y / n]。发送Y或n的最佳方式是什么?我做了很多搜索,发现了很多关于复制stdin的半答案,但是我还没有找到完整的解决方案。这是一个最小的例子:
#! /usr/bin/python3
import sys
import multiprocessing
e = multiprocessing.Event()
def get_input():
try:
x = input("Go ahead - type something\n")
print("typed " + x)
finally:
e.set()
# 1. Here it seems we should replace stdin?
multiprocessing.Process(target=get_input).start()
# 2. Here I want to write to stdin such that Process started above receives input
e.wait()
当然,这会立即死亡,因为输入使用的标准输出是关闭的,只返回一个EOF。如何覆盖stdin以从文件或某种本地缓冲区获取输入?
答案 0 :(得分:0)
我找到了适合我的解决方案。编辑上面的代码示例:
#! /usr/bin/python3
import multiprocessing
import sys
def get_input(newstdin, done):
sys.stdin = newstdin # replace stdin
try:
x = input("Go ahead - type something\n")
print("typed " + x)
finally:
done.set()
# This class will pretend to be stdin for my process
class FakeStdin(object):
def __init__(self):
self.input = multiprocessing.Queue()
def readline(self):
output = self.input.get(timeout=10)
return output or ''
def write(self, message):
self.input.put(message)
done = multiprocessing.Event()
newstdin = FakeStdin()
multiprocessing.Process(target=get_input, args=(newstdin, done)).start()
newstdin.write("test string") # write to the fake stdin
done.wait()
基本上,我创建了一个假stdin来给我设置sys.stdin的进程。这个假的stdin只需要实现readline
来在这里使用stdin。在readline
中,我等待使用Queue
的输入,我使用我调用write
的方法设置。