A comunicação do subprocesso Python mata meu processo
-
21-12-2019 - |
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
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())?