[파이썬] subprocess `subprocess.STD_INPUT_HANDLE`: 표준 입력 핸들 설정

In Python, the subprocess module provides a way to create and control subprocesses. One of the interesting features of this module is the subprocess.STD_INPUT_HANDLE constant, which allows you to manipulate the standard input of a subprocess.

The subprocess.STD_INPUT_HANDLE constant represents the handle for the standard input of a subprocess. It can be used to specify the input source when creating a subprocess, or to pass input to an already running subprocess.

Executing a Command with Custom Standard Input

To execute a command with custom standard input, you can use the subprocess.Popen class along with the stdin parameter. Here’s an example:

import subprocess

command = ['grep', 'foo']

input_data = b"Hello\nfoo world\nfoo bar\n"

process = subprocess.Popen(command, stdin=subprocess.STD_INPUT_HANDLE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate(input=input_data)

print(stdout.decode())

In this example, we create a Popen object and specify the stdin parameter as subprocess.STD_INPUT_HANDLE. We also specify the stdout and stderr parameters to capture the output and error streams of the subprocess.

Then, we call the communicate method, passing the input_data as the input for the subprocess. The method will return the standard output and standard error as byte strings.

Finally, we decode the standard output and print it to the console.

Passing Input to a Running subprocess

If you have a running subprocess and you want to pass additional input to it, you can use the subprocess.STD_INPUT_HANDLE constant with the process.stdin.write method.

import subprocess

process = subprocess.Popen(['grep', 'foo'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

# Pass input to the running subprocess
process.stdin.write(b"Hello\nfoo world\nfoo bar\n")
process.stdin.flush()

# Get the output
stdout, stderr = process.communicate()

print(stdout.decode())

In this example, we create a Popen object without specifying the stdin parameter, which makes it use the default standard input. Then, we write additional input to the subprocess using process.stdin.write and process.stdin.flush.

After that, we call communicate to get the output of the subprocess and print it.

Using subprocess.STD_INPUT_HANDLE provides flexibility when working with subprocesses in Python. It allows you to control the input source and pass input to running subprocesses effectively.