Estoy tratando de crear una secuencia de comandos que utiliza el módulo de multiprocesamiento con python. El script (vamos a llamarlo myscript.py) obtendrá la entrada de otro script con pipe.¿Hay alguna manera de pasar 'stdin' como argumento a otro proceso en python?
Supongamos que llamo a los scripts de esta manera;
$ python writer.py | python myscript.py
Y aquí están los códigos;
// writer.py
import time, sys
def main():
while True:
print "test"
sys.stdout.flush()
time.sleep(1)
main()
//myscript.py
def get_input():
while True:
text = sys.stdin.readline()
print "hello " + text
time.sleep(3)
if __name__ == '__main__':
p1 = Process(target=get_input, args=())
p1.start()
esto claramente no funciona, ya que los objetos sys.stdin son diferentes para el proceso principal y p1. Así que he intentado esto para resolverlo,
//myscript.py
def get_input(temp):
while True:
text = temp.readline()
print "hello " + text
time.sleep(3)
if __name__ == '__main__':
p1 = Process(target=get_input, args=(sys.stdin,))
p1.start()
pero me encuentro con este error;
Process Process-1:
Traceback (most recent call last):
File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
self._target(*self._args, **self._kwargs)
File "in.py", line 12, in get_input
text = temp.readline()
ValueError: I/O operation on closed file
Así que, supongo que el archivo stdin de main está cerrado y no puedo leer de él. En esta conjunción, ¿cómo puedo pasar el archivo stdin de main a otro proceso? Si no es posible pasar stdin, ¿cómo puedo usar el stdin de main de otro proceso?
actualización: Bien, necesito aclarar mi pregunta ya que la gente piensa que usar el multiprocesamiento no es realmente necesario. considere myscript.py
de esta manera;
//myscript.py
def get_input():
while True:
text = sys.stdin.readline()
print "hello " + text
time.sleep(3)
def do_more_things():
while True:
#// some code here
time.sleep(60*5)
if __name__ == '__main__':
p1 = Process(target=get_input, args=())
p1.start()
do_more_things()
es así, que realmente necesita para funcionar get_input() de forma paralela con la función principal (u otros subprocesos). Disculpe por los conflictos, tengo un inglés decente, y creo que no pude aclarar esta pregunta. Les agradecería si me pueden decir si puedo usar el proceso principal objeto STDIN en otro proceso.
gracias de antemano.
puede escribir a la entrada estándar usando la sintaxis encontrado aquí http://stackoverflow.com/questions/ 8880461/python-subprocess-output-to-list-or-file/8880555 # 8880555 Allí se usa para leer pero puede usar los mismos objetos –
¿Por qué 'myscript.py' crea un subproceso? ¿Por qué no simplemente lee de sys.stdin? Si lee de 'sys.stdin' el script de shell funcionaría perfectamente. ¿Por qué crear un subproceso? –
Hola S.Lott, este es solo un prototipo de mi problema, myscript.py contiene otro proceso que tiene otro ciclo infinito y se ejecuta como un daemon, así que simplemente no puedo leerlo en el proceso principal de myscript ya que writer.py también infinito y necesita ejecutarse como daemon. @JohanLundberg, gracias por su consejo, lo verificaré. –