[파이썬] subprocess 타임아웃 관리하기

Python’s subprocess module allows us to run external commands or programs from within our Python script. However, sometimes these external commands may run indefinitely or hang, causing our script to also hang. To avoid this situation, we can use the timeout parameter of the subprocess module to set a maximum time for the command to execute. In this blog post, we will explore how to manage timeouts effectively using subprocess in Python.

Setting a Timeout for Subprocess

The subprocess module provides us with the Popen class to create and manage subprocesses. We can set the timeout parameter in the Popen constructor to define the maximum time in seconds that we are willing to wait for the command to complete. If the command exceeds this time, a TimeoutExpired exception will be raised.

Here’s an example that demonstrates how to use Popen with a timeout:

import subprocess

try:
    result = subprocess.run(['command', 'arg1', 'arg2'], timeout=10, capture_output=True, text=True)
    print(result.stdout)
except subprocess.TimeoutExpired:
    print("Command timed out!")
except Exception as e:
    print(f"An error occurred: {str(e)}")

In the above code snippet, the subprocess.run function is used to execute the command command arg1 arg2 with a timeout of 10 seconds. The capture_output=True parameter is used to capture the command’s standard output, and text=True is used to get the output as a string. We catch the TimeoutExpired exception to handle the case when the command exceeds the timeout.

Handling Subprocess Timeout

When a timeout occurs, we have several options on how to handle it. We can raise an exception, terminate the subprocess, or perform any other action based on our requirements.

To terminate the subprocess when a timeout occurs, we can make use of the terminate() method provided by the Popen instance. Here’s an example:

import subprocess

proc = subprocess.Popen(['command', 'arg1', 'arg2'])
try:
    proc.wait(timeout=10)
except subprocess.TimeoutExpired:
    proc.terminate()
    print("Command terminated due to timeout!")

In the above code snippet, we create a subprocess using Popen and then call the wait method, specifying the timeout. If the command does not complete within the given time, a TimeoutExpired exception is raised. We then use terminate() to forcefully terminate the subprocess.

Conclusion

Managing timeouts in subprocesses is crucial to prevent our scripts from hanging indefinitely. Python’s subprocess module provides us with an easy way to set timeouts and handle them appropriately. By using the timeout parameter and handling the TimeoutExpired exception, we can ensure that our code executes within a specified time frame.

In this blog post, we covered the basics of managing timeouts in subprocesses using the subprocess module. Hopefully, you now have a better understanding of how to handle timeouts effectively in your Python scripts.

Remember, timeout management is important for maintaining the stability and responsiveness of your code. So, make sure to consider it when working with external commands or programs using subprocess.

Happy coding!