subprocess.Popen zombie

Alain Ketterlin alain at universite-de-strasbourg.fr.invalid
Wed May 20 11:42:07 EDT 2015


Robin Becker <robin at reportlab.com> writes:

> As part of a long running PyQT process running as a window app in Arch
> linux I needed an alert sound, I decided to use the beep command and
> the app code then looked like
>
> pid = Popen(['/home/robin/bin/mybeep', '-r3', '-f750', '-l100', '-d75']).pid
>
> the mybeep script handles module loading if required etc etc.
>
> Anyhow, this works with one slight oddity. When this code is executed
> it works fine, but leaves behind a single zombie process, when next
> executed the zombie disappears and a new zombie replaces it.
>
> Is this because I'm not waiting?

Yes, all processes will stay zombies until being wait()-ed for by their
parent process. This means: either you use call(...) which doesn't
return until the child process has finished, or you keep the Popen
object around and call wait() at an appropriate time.

> Does the process module reap previous commands in some way?

No.

> The code I used to use with os.spawnl was even worse in leaving
> zombies around.

For the same reason (os.wait() and os.waitpid() let you ... wait for
child-processes).

> I suppose I needed to keep a record of all the pid's and wait on them
> at some convenient time.

Yes.

> The subprocess version appears to be doing that for me somehow.

Not sure what you mean. You have to do the bookkeeping yourself.

(But, does beep really take so much time that you can't just call() it?)

-- Alain.



More information about the Python-list mailing list