I'm using the following command to run a shell command (creating a subprocess):
cmd = "ls"
process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True)
Then, I want to get its return code when it's finished. I should use wait()
or poll()
? It seems to me wait()
is equal to a poll()
enclosed in a busy wait. Something like:
while process.poll() == None:
time.sleep(0.5)
I read that wait()
could generate a deadlock if stdout/stderr
buffer is filled. process.poll()
used like above also could generate a deadlock? If this is true,
I should use process.comunicate()
to solve the problem? Nowadays, I only use
process.comunicate()
when I'm interested in the subprocess stdout/stderr
.
Thanks in advance.
Yes. subprocess.poll
, when used in a loop like that, will cause a deadlock if the stdout
is piped into your process and you aren't reading from it. If you don't pipe stdout
or you're consistently reading from it, neither poll
nor wait
will deadlock. subprocess.communicate
will solve the deadlock in the cases it would occur. However, if you just want to run a command, check its return code, and get its output, use subprocess.check_output
, which wraps all of that.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With