TGViewer
Zen of Python Zen of Python @zen_of_python · 18.8K subscribers
Post #5068 393
Почему subprocess с PIPE может зависнуть

Дочерний процесс пишет в stdout, родитель вызывает wait(). На небольшом выводе всё работает. На большом буфер канала заполняется: ребёнок ждёт чтения, родитель — завершения ребёнка.

В разборе взаимной блокировки показано, почему каналы нужно читать во время работы процесса. Для ограниченного вывода удобен run():

import subprocess

result = subprocess.run(
["python", "--version"],
capture_output=True,
text=True,
timeout=10,
check=True,
)


Он использует communicate(), который обслуживает оба потока. Вывод при этом собирается в памяти, поэтому для больших логов выбирайте файл или потоковое чтение.

У Popen.communicate(timeout=...) другая тонкость: истечение тайм-аута само не убивает процесс. Нужны завершение процесса и повторный communicate() для чтения остатка вывода.

#python #процессы
More from @zen_of_python
  1. Oct 15, 2026Как запустить тесты самого Django через uv Хотите исправить баг в Django? Сначала понадоби…
  2. Oct 15, 2026Почему тест проходит отдельно и падает в наборе Один тест добавляет объект в общий список,…
  3. Oct 14, 2026Почему Rust внутри CPython предлагают начать с zlib На Python Language Summit обсудили пос…
  4. Oct 14, 2026Почему mmap не всегда избавляет от копирования mmap позволяет обращаться к содержимому фай…
  5. Oct 14, 2026Post #5063
  6. Oct 14, 2026Когда Path.info экономит обращения к файловой системе При обходе большого каталога проверк…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →