본문 바로가기
Python/파이썬 문법, 함수, 모듈 등

[Python] 외부 프로세스 실행하는 법 subprocess

by dong_su 2024. 5. 28.

subprocess란?

파이썬에서 외부 프로세스를 실행하고 상호작용하는 데 사용

 

이 모듈을 사용하면 새로운 프로세스를 생성하고 커뮤니케이션을 통해 입력을 전달하고 결과를 받아올 수 있습니다.

주요 함수로는 subprocess.Popen()과 subprocess.run()이 있습니다.

  1. subprocess.Popen(): 이 함수는 외부 명령어를 실행하고 상호작용할 수 있는 프로세스 객체를 반환합니다. 이를 통해 표준 입력(stdin), 표준 출력(stdout), 표준 에러(stderr)를 제어할 수 있습니다. 이를 통해 여러 파이프라인으로 데이터를 전달하고 프로세스 간 통신을 할 수 있습니다.
  2. subprocess.run(): 이 함수는 명령어를 실행하고 결과를 반환합니다. 주로 간단한 명령어를 실행하고 그 결과를 받아올 때 사용됩니다.

subprocess 모듈을 사용하면 외부 프로그램을 호출하고 그 결과를 캡처하거나, 다른 프로세스와 데이터를 교환하거나, 여러 프로세스 간의 통신을 할 수 있습니다. 이를 통해 파이썬은 다양한 운영 체제의 다른 프로그램과 상호작용할 수 있게 됩니다.


사용 예시)

import subprocess
import sys

# main.py

# 외부 프로세스(sub.py)를 실행하고 stdin과 stdout을 파이프로 연결하여 관리
with subprocess.Popen(["python", "sub.py"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True, encoding="utf-8") as process:
    # 여러 줄의 데이터를 서브프로세스로 보냄
    data1 = "Popen data 1\n"
    data2 = "Popen data 2\n"
    
    # 서브프로세스에 데이터를 전송
    process.stdin.write(data1)
    process.stdin.write(data2)
    
    # 표준 입력 종료
    process.stdin.close()

    # 서브프로세스의 결과 읽기
    output_data = process.stdout.read()

    # 결과 출력
    print("sub.py의 실행 결과:", output_data)

# ---------------------------------------------------------------------------------------------------
# sub.py

import sys

# 메인 프로세스(main.py)로부터 데이터를 받아 출력
for line in sys.stdin:
    print("Received:", line.strip())

 

  1. main.py: 메인 스크립트
    • subprocess.Popen()을 사용하여 외부 프로세스인 sub.py를 실행합니다.
    • stdin=subprocess.PIPE로 설정하여 표준 입력을 파이프로 연결합니다.
    • stdout=subprocess.PIPE로 설정하여 표준 출력을 파이프로 연결합니다.
    • text=True로 설정하여 텍스트 모드로 처리합니다.
    • encoding="utf-8"로 설정하여 UTF-8 인코딩을 사용합니다.
    • with문을 사용하여 Popen 객체를 생성하고 관리합니다.
    • process.stdin.write(data)를 사용하여 서브프로세스로 데이터를 전송합니다.
    • process.stdin.close()를 호출하여 표준 입력을 닫습니다.
    • process.stdout.read()를 사용하여 서브프로세스의 결과를 읽습니다.
    • 결과를 출력합니다.
  2. sub.py: 서브 프로세스 스크립트
    • sys.stdin을 통해 메인 프로세스로부터 데이터를 받습니다.
    • 받은 데이터를 출력합니다.

이 코드를 실행하면 main.py가 sub.py를 실행하고, sub.py는 main.py로부터 전달받은 데이터를 출력합니다.