Основываясь на ответе zseil, вы можете сделать это с помощью сочетания вызовов подпроцесса и win32 API. Я использовал прямые ctypes, потому что на моем Python не установлено win32api. Я просто порождаю sleep.exe от MSYS в качестве примера, но, очевидно, вы можете запустить любой процесс, который вам нравится. Я использую OpenProcess (), чтобы получить HANDLE из PID процесса, а затем WaitForMultipleObjects, чтобы дождаться завершения любого процесса.
import ctypes, subprocess
from random import randint
SYNCHRONIZE=0x00100000
INFINITE = -1
numprocs = 5
handles = {}
for i in xrange(numprocs):
sleeptime = randint(5,10)
p = subprocess.Popen([r"c:\msys\1.0\bin\sleep.exe", str(sleeptime)], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False)
h = ctypes.windll.kernel32.OpenProcess(SYNCHRONIZE, False, p.pid)
handles[h] = p.pid
print "Spawned Process %d" % p.pid
while len(handles) > 0:
print "Waiting for %d children..." % len(handles)
arrtype = ctypes.c_long * len(handles)
handle_array = arrtype(*handles.keys())
ret = ctypes.windll.kernel32.WaitForMultipleObjects(len(handle_array), handle_array, False, INFINITE)
h = handle_array[ret]
ctypes.windll.kernel32.CloseHandle(h)
print "Process %d done" % handles[h]
del handles[h]
print "All done!"