Связь с подпроцессом Python убивает мой процесс
-
21-12-2019 - |
Вопрос
Почему общение убивает мой процесс?Я хочу интерактивный процесс, но communicate делает что-то такое, что я больше не могу использовать raw_input в своем процессе.
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'))
исключение!
self.stdin.write(input)
ValueError: I/O operation on closed file
Решение
communicate
и wait
методы Popen
объекты, закройте PIPE
после того, как процесс вернется.Если вы хотите оставаться на связи с процессом, попробуйте что-то вроде этого:
import subprocess
proc = subprocess.Popen("some_process", stdout=subprocess.PIPE, stdin=subprocess.PIPE)
proc.stdin.write("input")
proc.stdout.readline()
Другие советы
Почему общаться убить мой процесс?
из документов для Docs для Popen.communicate(input=None, timeout=None)
: P >.
взаимодействовать с процессом: отправлять данные в stdin. Читайте данные из Stdout и
Стдерр, до конца файла. ждать, пока процесс завершится. подчеркивать шахты
Вы можете назвать .communicate()
только один раз. Это означает, что вы должны предоставить все входные данные одновременно:
#!/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]
.
Выход
Still Running
Still Running 0
Still Running 1
quit
.
Обратите внимание на удвоенные новинки: один из '\r\n'
и другого из оператора print
в вашем сценарии для ребенка.
показывает, что дочерний процесс успешно получает три входных строка ('y'
, 'y'
и 'n'
).
Вот аналогичный код, использующий ГенеракодичецCode ScreenacodicCode Parameter от 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='')
.
Это производит тот же выход.
Если вы хотите обеспечить другой вход в зависимости от ответов от дочерних процессов, затем используйте модуль subprocess.check_output()
или его аналоги, чтобы избежать проблем, упомянутых в Почему бы не просто использовать трубу (POPEN ())?