input()在进程内不起作用

时间:2014-04-15 12:15:48

标签: python linux ubuntu input multiprocessing

我需要在我的应用程序的进程中使用input()。我写了一个小测试,因为我遇到了一些问题。

from multiprocessing import Process, Queue

class InputCatcher(Process):
    def __init__(self, input_queue):
        Process.__init__(self)
        self.input_queue = input_queue

    def run(self):
        while True:
            self.input_queue.put(input())


input_queue = Queue()
ic = InputCatcher(input_queue)
ic.daemon = True
ic.start()

while True:
    if not input_queue.empty():
        print(input_queue.get())

不幸的是我收到了这个错误:

Process InputCatcher-1:
Traceback (most recent call last):
File "/usr/lib/python3.3/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/home/****/PycharmProjects/****/test/inputtestproces.py", line 13, in run
self.input_queue.put(input())
EOFError: EOF when reading a line

有没有办法让它发挥作用?

1 个答案:

答案 0 :(得分:3)

来自multiprocessing文档(https://docs.python.org/2/library/multiprocessing.html#all-platforms):

  

最初无条件地称为多处理:

     

os.close(sys.stdin.fileno())

     multiprocessing.Process._bootstrap()方法中的

- 这导致了问题   与流程中的流程。这已改为:

     

sys.stdin.close()

     

sys.stdin = open(os.devnull)

因此,为该进程关闭一个进程将关闭stdin,并将其替换为/dev/null的文件描述符。

在回答你的问题时,解决这个问题的方法是颠倒代码的逻辑,让主进程等待用户输入,而分叉进程执行主进程的原始作业。

暂且不说:从您发布的代码来看,您可能更好地使用threading模块而不是multiprocessing模块。除非您计划在分叉进程中执行一些计算密集型操作,否则multiprocessing模块有点像矫枉过正。线程间通信通常比进程间通信更简单。