2017-03-17 113 views
1

我需要将数据写入到我创建的进程中。由于各种原因,它已将设为multiprocessing.Process。假设这个过程执行类似于运行apt upgrade的操作,然后会提示用户输入[Y/n]。发送Y或n的最佳方式是什么?我做了很多搜索,发现了很多关于复制stdin的答案,但是我一直没有想出一个完整的解决方案。下面是一个简单的例子:写入python多进程的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() 

当然,这会因为输入使用的stdin被关闭而刚刚返回一个EOF而立即死亡。我如何覆盖标准输入从文件或某种本地缓冲区输入?

回答

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() 

基本上,我创建了一个假的标准输入到给我处理这台sys.stdin。这个假标准输入只需要执行readline来鸭式输入我在这里使用stdin。在readline中,我使用Queue等待输入,我用我称之为write的方法进行设置。