Pregunta

¿Por qué la comunicación mata mi proceso?Quiero un proceso interactivo, pero comunicar hace algo para que ya no pueda utilizar raw_input en mi proceso.

from sys import stdin 
from threading import Thread
from time import sleep

if __name__ == '__main__':
    print("Still Running\n")
    x = raw_input()    
    i = 0
    while ('n' not in x ) :
        print("Still Running " + str(i) + " \r\n")
        x = raw_input()
        i += 1

    print("quit")



print(aSubProc.theProcess.communicate('y'))
print(aSubProc.theProcess.communicate('y'))

¡excepción!

self.stdin.write(input)
ValueError: I/O operation on closed file
¿Fue útil?

Solución

communicate y wait métodos de Popen objetos, cierre el PIPE después de que el proceso regrese.Si desea mantenerse en comunicación con el proceso, intente algo como esto:

import subprocess
proc = subprocess.Popen("some_process", stdout=subprocess.PIPE, stdin=subprocess.PIPE)
proc.stdin.write("input")
proc.stdout.readline()

Otros consejos

¿Por qué la comunicación mata mi proceso?

De los documentos para Popen.communicate(input=None, timeout=None):

Interactuar con el proceso:Enviar datos a stdin.Leer datos de stdout y
stderr, hasta llegar al final del archivo. Espere a que finalice el proceso. enfatizar el mío

puedes llamar .communicate() sólo una vez.Significa que debes proporcionar todos los datos a la vez:

#!/usr/bin/env python
import os
import sys
from subprocess import Popen, PIPE

p = Popen([sys.executable, 'child.py'], stdin=PIPE, stdout=PIPE)
print p.communicate(os.linesep.join('yyn'))[0]

Producción

Still Running

Still Running 0 

Still Running 1 

quit

Observe las nuevas líneas duplicadas:uno de '\r\n' y otro de print declaración misma en su script para el proceso hijo.

El resultado muestra que el proceso hijo recibió tres líneas de entrada con éxito ('y', 'y', y 'n').

Aquí hay un código similar usando subprocess.check_output()'s input parámetro de Python3.4:

#!/usr/bin/env python3.4
import os
import sys
from subprocess import check_output

output = check_output(['python2', 'child.py'], universal_newlines=True,
                      input='\n'.join('yyn'))
print(output, end='')

Produce el mismo resultado.


Si desea proporcionar una entrada diferente dependiendo de las respuestas de los procesos secundarios, utilice pexpect módulo o sus análogos para evitar los problemas mencionados en ¿Por qué no utilizar simplemente una tubería (popen())?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top