2011-04-17 24 views
7

我有一个系统需要接收来自几个不同进程的输入。最简单的就是用户手动输入数据的命令行。这些数据将被添加到multiprocessing.Queue,稍后由主进程处理,但我甚至没有那么深;在进程内调用raw_input似乎不起作用。我掏出代码的肉和这里有一个例子:在一个进程中输入Python命令行

import multiprocessing 

def f(): 
    while True: 
     raw_input('>>>') 

p = multiprocessing.Process(target = f) 
p.start() 

这个简单的代码抛出这样的:

~$ python test.py 
Process Process-1: 
Traceback (most recent call last): 
    File "/usr/lib/python2.6/multiprocessing/process.py", line 232, in _bootstrap 
    self.run() 
    File "/usr/lib/python2.6/multiprocessing/process.py", line 88, in run 
    self._target(*self._args, **self._kwargs) 
    File "test.py", line 5, in f 
    raw_input('>>>') 
EOFError: EOF when reading a line 
>>>~$ 

如何,我可以得到命令行输入Python中的过程?

回答

8

当你在Python中产生一个线程时,it closes stdin。您不能使用子流程来收集标准输入。使用主线程来收集输入,并将它们从主线程发布到队列中。有可能将stdin传递给另一个线程,但您可能需要在主线程中关闭它。

+0

经过一番思考,Python创作者的决定对我来说是有意义的。我试图做到这一点的事实指向了我的一个糟糕的设计,我需要转向更多的客户端/服务器模式。谢谢你的帮助! – kerkeslager 2011-04-18 16:12:17

+1

在这种情况下使用“process”而不是'thread'。 – jfs 2014-04-15 13:12:51

2

我能够通过使用fdopen()重新打开子进程中的stdin来解决此问题。 See this answer。它似乎在工作,我不知道是否有隐藏的风险。