Pergunta

Por que a comunicação mata meu processo?Eu quero um processo interativo, mas a comunicação faz algo para que eu não possa mais usar raw_input no meu processo.

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'))

exceção!

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

Solução

communicate e wait métodos de Popen objetos, feche o PIPE após o processo retornar.Se você quiser manter a comunicação com o processo, tente algo assim:

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

Outras dicas

Por que a comunicação mata meu processo?

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

Interaja com o processo:Envie dados para stdin.Leia os dados do stdout e
stderr, até que o final do arquivo seja alcançado. Aguarde o término do processo. enfatize o meu

Você pode ligar .communicate() apenas uma vez.Isso significa que você deve fornecer todas as informações de uma 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]

Saída

Still Running

Still Running 0 

Still Running 1 

quit

Observe as novas linhas duplicadas:um de '\r\n' e outro de print declaração em seu script para o processo filho.

A saída mostra que o processo filho recebeu três linhas de entrada com sucesso ('y', 'y', e 'n').

Aqui está um código semelhante usando subprocess.check_output()de input parâmetro do 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='')

Ele produz a mesma saída.


Se você quiser fornecer uma entrada diferente dependendo das respostas dos processos filhos, use pexpect módulo ou seus análogos para evitar problemas mencionados em Por que não usar apenas um pipe (popen())?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top