2011-04-17 10 views
7

Tengo un sistema que necesita recibir datos de algunos procesos diferentes. Lo más simple es solo una línea de comando donde el usuario ingresa los datos manualmente. Esta información se agregará a multiprocessing.Queue y luego será procesada por el proceso principal, pero ni siquiera estoy llegando tan lejos; llamar al raw_input dentro de un proceso no parece funcionar. Saqué la carne del código y aquí está un ejemplo:Entrada de línea de comandos de Python en un proceso

import multiprocessing 

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

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

Este código simple lanza esto:

~$ 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 
>>>~$ 

¿Cómo puedo obtener la entrada de línea de comandos en un proceso en Python?

Respuesta

8

Cuando genera un hilo en Python, it closes stdin. No puede usar un subproceso para recopilar datos estándar. Use el hilo principal para recopilar la entrada en su lugar y publicarlos en la cola del hilo principal. Es posible pasar el stdin a otro hilo, pero es probable que deba cerrarlo en su hilo principal.

+0

Después de pensarlo un poco, la decisión de los creadores de Python tiene sentido para mí. El hecho de que estoy tratando de hacer esto apunta a un mal diseño de mi parte y tengo que pasar a un modelo más cliente/servidor-ish. ¡Gracias por tu ayuda! – kerkeslager

+1

usa la palabra 'proceso' en lugar de' hilo' en este caso. – jfs

2

Pude solucionar esto utilizando fdopen() para volver a abrir stdin en el subproceso. See this answer. Parece estar funcionando, no sé si hay algún riesgo oculto.

Cuestiones relacionadas