Согласно Python 3,6 документов для Popen :
Если preexec_fn установлен в вызываемый объект, этот объект будет вызываться в дочернем процессе непосредственно перед дочерним процессом выполнен. (Только для POSIX)
Тогда почему родительский процесс зависает при выполнении функции preexec_fn? Если он выполняется в дочернем процессе, то родительский процесс должен быть в состоянии продолжить.
Вот небольшой пример программы, которая создает новый процесс "ls", перед которым он спит в течение 4 секунд. В идеале «достигнуто» должно быть напечатано сразу, но это не так. "достигнуто" напечатано через 4 секунды.
import os
import subprocess
import sys
import tempfile
import time
def sleep_a_little():
time.sleep(4)
p = subprocess.Popen(["ls"], preexec_fn=sleep_a_little)
print("reached")