> For the complete documentation index, see [llms.txt](https://treasuremaster.gitbook.io/python-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://treasuremaster.gitbook.io/python-docs/moduli-standartnoi-biblioteki-1/parallelnoe-vypolnenie/subprocess/popen.communicate.md).

# Popen.communicate ()

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

Взаимодействие с процессом: отправка данных на стандартный ввод [**stdin**](/python-docs/moduli-standartnoi-biblioteki-1/parallelnoe-vypolnenie/subprocess/popen.stdin.md). Читает данные из [**stdout**](/python-docs/moduli-standartnoi-biblioteki-1/parallelnoe-vypolnenie/subprocess/popen.stdout.md) и [**stderr**](/python-docs/moduli-standartnoi-biblioteki-1/parallelnoe-vypolnenie/subprocess/popen.stderr.md), пока не будет достигнут конец файла. Подождите, пока процесс завершится, и установится атрибут [returncode](/python-docs/moduli-standartnoi-biblioteki-1/parallelnoe-vypolnenie/subprocess/popen.returncode.md). Необязательный аргумент ***input*** должен быть данными для отправки дочернему процессу или `None`, если данные не должны отправляться дочернему процессу. Если потоки были открыты в текстовом режиме, ***input*** должен быть строкой. В противном случае это должны быть байты.

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

Обратите внимание: если вы хотите отправлять данные на стандартный ввод процесса [**stdin**](/python-docs/moduli-standartnoi-biblioteki-1/parallelnoe-vypolnenie/subprocess/popen.stdin.md), вам необходимо создать объект [**Popen**](/python-docs/moduli-standartnoi-biblioteki-1/parallelnoe-vypolnenie/subprocess/subprocess.popen.md) с помощью `stdin = PIPE`. Точно так же, чтобы получить в результирующем кортеже что-либо, кроме `None`, вам также необходимо указать `stdout = PIPE` и / или `stderr = PIPE`.

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

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

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

{% hint style="info" %}
Считанные данные буферизуются в памяти, поэтому не используйте этот метод, если размер данных большой или неограниченный.
{% endhint %}

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