Вы перехватываете SIGCHLD в сценарии? Если это так, Popen не будет работать так, как ожидалось, поскольку он полагается на свой собственный обработчик для этого сигнала.
Вы можете проверить обработчики SIGCHLD, закомментировав вызов Popen и выполнив:
strace python <your_script.py> | grep SIGCHLD
если вы видите что-то похожее на:
rt_sigaction(SIGCHLD, ...)
тогда у вас проблемы. Вам нужно отключить обработчик перед вызовом Popen, а затем сбросить его после завершения связи (это может привести к условиям гонки, так что будьте осторожны).
signal.signal(SIGCHLD, handler)
...
signal.signal(SIGCHLD, signal.SIG_DFL)
'''
now you can go wild with Popen.
WARNING!!! during this time no signals will be delivered to handler
'''
...
signal.signal(SIGCHLD, handler)
Об этом сообщается об ошибке Python, и, насколько я понимаю, она еще не устранена:
http://bugs.python.org/issue9127
Надеюсь, это поможет.