2017-03-17 123 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的方法進行設置。