[파이썬] subprocess 프로세스 간의 데이터 교환

Subprocess 모듈은 Python에서 외부 프로세스를 생성하고 관리하는데 사용되는 강력한 도구입니다. 이 모듈을 사용하면 Python 프로그램에서 다른 프로그램을 실행하고, 실행하는 동안 데이터를 교환할 수 있습니다. 이 글에서는 subprocess 모듈을 사용하여 프로세스 간의 데이터 교환을 어떻게 수행할 수 있는지 살펴보겠습니다.

프로세스 생성하기

먼저, subprocess 모듈을 사용하여 외부 프로세스를 생성해 보겠습니다. 아래의 예제 코드는 ‘echo’ 명령어를 실행하는 방법을 보여줍니다.

import subprocess

# 'echo' 명령어를 실행하고 결과를 확인
result = subprocess.run(['echo', 'Hello, World!'], capture_output=True, text=True)

# 실행 결과 출력
print(result.stdout)

위의 코드에서 subprocess.run() 함수는 ‘echo’ 명령어를 실행하고 실행 결과를 result 변수에 저장합니다. capture_output=Truetext=True 옵션을 사용하여 실행 결과를 캡처하고, 텍스트 포맷으로 변환합니다. 마지막으로, result.stdout를 출력하여 실행 결과를 확인할 수 있습니다.

데이터 입력하기

외부 프로세스에 데이터를 입력하는 방법도 살펴보겠습니다. subprocess.run() 함수의 input 매개변수를 사용하여 데이터를 전달할 수 있습니다. 다음은 ‘grep’ 명령어를 사용하여 특정 문자열을 검색하는 예제입니다.

import subprocess

# 'grep' 명령어를 실행하고 입력 데이터를 전달
result = subprocess.run(['grep', 'word'], input='This is a sample text', capture_output=True, text=True)

# 실행 결과 출력
print(result.stdout)

위의 코드에서 input 매개변수에 “This is a sample text” 문자열을 전달하여 ‘grep’ 명령어에 입력 데이터로 사용합니다. 실행 결과는 result.stdout를 통해 확인할 수 있습니다.

데이터 출력하기

외부 프로세스에서 출력되는 데이터를 Python 프로그램으로 가져오는 방법을 알아봅시다. subprocess.run() 함수의 capture_output=True 옵션을 사용하여 프로세스 실행 결과를 캡처할 수 있습니다. 다음은 ‘ls’ 명령어를 실행하여 디렉토리 내의 파일 목록을 가져오는 예제입니다.

import subprocess

# 'ls' 명령어를 실행하고 실행 결과를 캡처
result = subprocess.run(['ls'], capture_output=True, text=True)

# 실행 결과 출력
print(result.stdout)

위의 코드에서 ‘ls’ 명령어 실행 결과는 result.stdout에 저장되며, 이를 통해 파일 목록을 확인할 수 있습니다.

데이터 교환하기

이제 외부 프로세스에 입력 데이터를 전달하고, 프로세스에서 출력되는 결과를 받아올 수 있는 방법을 알게 되었습니다. 데이터 교환에는 여러가지 방법이 있을 수 있습니다. 예를 들어, subprocess.run() 함수를 여러 번 사용하여 여러 개의 외부 프로세스를 실행할 수도 있습니다.

그러나 복잡한 데이터 교환을 위해서는 subprocess.Popen 클래스를 사용하는 것이 보다 효율적입니다. 이 클래스는 외부 프로세스와 상호 작용하는 데 사용할 수 있는 더 많은 기능을 제공합니다.

import subprocess

# 'cat' 명령어를 실행하고 이전 명령어의 실행 결과를 입력으로 사용
p1 = subprocess.Popen(['echo', 'Hello, World!'], stdout=subprocess.PIPE)
p2 = subprocess.Popen(['cat'], stdin=p1.stdout, stdout=subprocess.PIPE)

# 'cat' 명령어의 실행 결과 출력
output = p2.communicate()[0]
print(output)

위의 코드에서 먼저 subprocess.Popen 클래스를 사용하여 ‘echo’ 명령어를 실행하고 실행 결과를 p1 변수에 저장합니다. 그런 다음 subprocess.Popen 클래스를 다시 사용하여 ‘cat’ 명령어를 실행하며, 이전 명령어의 실행 결과를 입력으로 사용합니다. 마지막으로 p2.communicate()[0]를 통해 ‘cat’ 명령어의 실행 결과를 출력합니다.

결론

Python의 subprocess 모듈은 외부 프로세스와의 데이터 교환을 쉽게 할 수 있도록 도와줍니다. 이 모듈을 사용하여 프로세스를 생성하고, 데이터를 입력하고, 출력 데이터를 가져올 수 있습니다. 데이터의 입력과 출력을 다루는 더 많은 기능을 사용하고자 한다면 subprocess.Popen 클래스를 사용하는 것이 좋습니다.