Message 257071 - Python tracker (original) (raw)

I came across a situation where Popen.wait() hangs and os.waitpid() doesn't hang. It seems like a bug, but I don't know for sure. This is with Python 3.5.1.

To reproduce, save the following to demo.py:

import os, signal, subprocess

class State:
    process = None

def handle_signal(signalnum, frame):
    print("Handling: {0}".format(signalnum))
    p = State.process
    # The following line hangs:
    p.wait()
    # However, this line does not hang:
    # os.waitpid(p.pid, 1)
    print("Done waiting")

signal.signal(signal.SIGINT, handle_signal)
p = subprocess.Popen("while true; do echo sleeping; sleep 2; done",
                     shell=True)
State.process = p
p.wait()

Then run the following, hit Control-C, and it will hang:

$ python demo.py 
sleeping
sleeping
^CHandling: 2

It will still hang if you insert "p.terminate()" right before p.wait().

However, calling "os.waitpid(p.pid, ...)" instead of p.wait() exits immediately and does not hang. The behavior also occurs without shell=True.