Popen.communicate ()

Popen.communicate ( input=None, timeout=None )

Взаимодействие с процессом: отправка данных на стандартный ввод stdin. Читает данные из stdout и stderr, пока не будет достигнут конец файла. Подождите, пока процесс завершится, и установится атрибут returncode. Необязательный аргумент input должен быть данными для отправки дочернему процессу или None, если данные не должны отправляться дочернему процессу. Если потоки были открыты в текстовом режиме, input должен быть строкой. В противном случае это должны быть байты.

communicate () возвращает кортеж (stdout_data, stderr_data). Данные будут строками, если потоки открывались в текстовом режиме; в противном случае байты.

Обратите внимание: если вы хотите отправлять данные на стандартный ввод процесса stdin, вам необходимо создать объект Popen с помощью stdin = PIPE. Точно так же, чтобы получить в результирующем кортеже что-либо, кроме None, вам также необходимо указать stdout = PIPE и / или stderr = PIPE.

Если процесс не завершится по истечении timeout секунд ожидания, будет возбуждено исключение TimeoutExpired. Перехват этого исключения и повторная попытка связи не приведет к потере вывода.

Дочерний процесс не уничтожается, если истекает timeout, поэтому для правильной очистки приложение с хорошим поведением должно убить дочерний процесс и завершить обмен данными:

proc = subprocess.Popen(...)
try:
    outs, errs = proc.communicate(timeout=15)
except TimeoutExpired:
    proc.kill()
    outs, errs = proc.communicate()

Считанные данные буферизуются в памяти, поэтому не используйте этот метод, если размер данных большой или неограниченный.

Изменено в версии 3.3: добавлен timeout.

Last updated