Python subprocess library is used to run processes like bash script in the background. It can create new processes, connect with their input/output/error pipes and obtain their error codes.
Code Example –
import subprocess // run a bash script in background process_var = subprocess.Popen(["/path/to/your/bashfile.sh"]) // Getting process id var pid = process_var.pid // Terminate this process process_var.terminate()
Introduction
subprocess library of Python is the standard way of starting a process in the background. PEP 324 supports this. It has one class called Popen. You may directly use the run() function like this –
subprocess.run(["ls", "-l"])
Terminating background script after a timeout
You may use communicate() method and pass the timeout value as argument. If the process didn’t complete within timeout then it will be killed. Example –
import subprocess
process_var = subprocess.Popen(["/path/to/your/bashfile.sh"])
try:
outs, errs = process_var.communicate(timeout=15)
except TimeoutExpired:
process_var.kill()
Timeout is set in seconds.
How to check if process is still running or terminated?
subprocess library provides poll() function to check if the process is still running or terminated. It returns a returncode whose values are –
-
None– It means the process is running and not terminated. -
-N– Terminated by some signalN. -
0– Completed
import subprocess process_var = subprocess.Popen(["/path/to/your/bashfile.sh"]) return_code = process_var.poll() // return_code = None ==> Process is running // return_code = -something ==> terminated by something
How to get output from process?
We need to pass stdout=subprocess.PIPE in Popen method to get the output from the process. Check this example –
import subprocess
process_var = subprocess.Popen(["/path/to/your/bashfile.sh"], stdout=subprocess.PIPE)
try:
outs, errs = process_var.communicate(timeout=15)
// Get your output here
print("Output: ", outs)
except TimeoutExpired:
process_var.kill()
Conclusion
subprocess library is the most recommended way of starting a background process and running bash scripts. We can pass data and read the output easily. It also provides utility methods to keep the track of running process.