写入python multiprocessing.Process的stdin

时间:2017-03-17 21:15:02

标签: python linux multithreading

我需要将数据写入我创建的进程。由于各种原因, 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以从文件或某种本地缓冲区获取输入?

1 个答案:

答案 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的方法设置。