Oct 28, 2016

[python] subprocess block/unblock call

Blocking and Non Blocking subprocess calls

nonblocking: Popen (calling its wait or communicate method to make the call wait/block)
blocking: call , check_call

Strictly speaking, shell=True is orthogonal to the issue of blocking. However, shell=True causes Python to exec a shell and then run the command in the shell. If you use a blocking call, the call will return when the shell finishes. Since the shell may spawn a subprocess to run the command, the shell may finish before the spawned subprocess. For example,

import subprocess
import time

proc = subprocess.Popen('ls -lRa /', shell=True)
time.sleep(3)
proc.terminate()
proc.wait()

Here two processes are spawned: Popen spawns one subprocess running the shell. The shell in turn spawns a subprocess running ls.
proc.terminate() kills the shell, but the subprocess running ls remains.
(That is manifested by copious output, even after the python script has ended.
Be prepared to kill the ls with pkill ls.)

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.