向Python multiprocessing.Process的stdin写入数据

3

我需要向我创建的进程写入数据。由于各种原因,这必须是一个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()

当然,由于使用input的stdin已经关闭并只返回EOF,因此此过程会立即失败。我如何覆盖stdin以从文件或某种本地缓冲区获取输入?
1个回答

2
我发现一个适合我的解决方案。编辑上面的代码示例:
#! /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方法设置的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接