subprocess.run()
was added in Python 3.5 as a simplification over subprocess.Popen
when you just want to execute a command and wait until it finishes, but you don’t want to do anything else in the mean time. For other cases, you still need to use subprocess.Popen
.
The main difference is that subprocess.run()
executes a command and waits for it to finish, while with subprocess.Popen
you can continue doing your stuff while the process finishes and then just repeatedly call Popen.communicate()
yourself to pass and receive data to your process. Secondly, subprocess.run()
returns subprocess.CompletedProcess
.
subprocess.run()
just wraps Popen
and Popen.communicate()
so you don’t need to make a loop to pass/receive data or wait for the process to finish.
Check the official documentation for info on which params subprocess.run()
pass to Popen
and communicate()
.