Вопрос

Почему общение убивает мой процесс?Я хочу интерактивный процесс, но 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 ())?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top