본문 바로가기

Study Information Technology

Python의 subprocess 모듈 완벽 가이드 셸 명령어 실행과 시스템 프로세스 통합

728x90
반응형

Python의 subprocess 모듈 완벽 가이드: 셸 명령어 실행과 시스템 프로세스 통합

Overview

Python의 subprocess 모듈은 외부 셸 명령어를 실행하고, 시스템 프로세스를 제어하며, 명령어의 입력 및 출력을 처리하는 강력한 도구입니다. 이 모듈은 다양한 기능을 제공하여 시스템 작업을 자동화하거나 다른 프로그램과의 연동을 쉽게 할 수 있도록 돕습니다. 이 가이드에서는 subprocess 모듈의 주요 기능과 사용 방법을 자세히 설명하며, 예제와 함께 에러 처리 방법도 다루겠습니다.

subprocess 모듈의 기본 개념

subprocess 모듈은 Python 스크립트에서 외부 명령어를 실행할 수 있게 해줍니다. 이를 통해 시스템 명령어를 호출하거나 다른 프로그램을 실행할 수 있습니다. subprocess 모듈은 다음과 같은 주요 기능을 제공합니다:

  • 명령어 실행: 셸 명령어를 실행하고, 명령어의 출력 및 오류를 처리합니다.
  • 입출력 제어: 명령어의 입력을 제공하거나 명령어의 출력을 캡처할 수 있습니다.
  • 프로세스 관리: 프로세스를 생성하고, 종료시키며, 상태를 확인할 수 있습니다.

subprocess.run(): 명령어 실행의 핵심

subprocess.run() 함수는 명령어를 실행하고, 완료될 때까지 기다린 후 결과를 반환합니다. 이 함수는 Python 3.5 이상에서 도입되었으며, 가장 많이 사용되는 subprocess 함수 중 하나입니다.

기본 사용법

import subprocess

# 명령어를 실행하고 결과를 반환받습니다.
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)

# 명령어의 출력 결과를 확인합니다.
print(result.stdout)

위의 코드는 ls -l 명령어를 실행하고, 출력 결과를 stdout으로 받아서 출력합니다. capture_output=True는 명령어의 출력을 캡처하도록 설정하는 옵션입니다. text=True는 출력 결과를 문자열로 변환합니다.

주요 매개변수

  • args: 실행할 명령어와 인수들을 리스트로 전달합니다. 문자열을 직접 전달하면 셸에서 명령어가 실행됩니다.
  • capture_output: 명령어의 표준 출력과 표준 오류를 캡처합니다.
  • text: 출력 결과를 바이트가 아닌 문자열로 반환합니다.
  • timeout: 명령어 실행에 제한 시간을 설정합니다.
  • check: 명령어가 비정상 종료될 경우 예외를 발생시킵니다.

예제: 명령어 실행 및 결과 확인

import subprocess

try:
result = subprocess.run(['echo', 'Hello, World!'], capture_output=True, text=True, check=True)
print('출력:', result.stdout.strip())
except subprocess.CalledProcessError as e:
print(f'명령어 실행 실패: {e}')

이 예제는 echo Hello, World! 명령어를 실행하고, 결과를 출력합니다. check=True를 설정하면 명령어가 실패할 경우 CalledProcessError 예외가 발생합니다.

subprocess.Popen(): 더 많은 제어와 유연성

subprocess.Popen()은 더 많은 제어가 필요할 때 사용하는 함수입니다. 이 함수는 비동기적으로 명령어를 실행하며, 프로세스의 입출력 스트림을 세밀하게 제어할 수 있습니다.

기본 사용법

import subprocess

# Popen을 사용하여 프로세스를 시작합니다.
process = subprocess.Popen(['grep', 'python'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True)

# 프로세스에 입력을 전달하고, 출력을 받아옵니다.
stdout, stderr = process.communicate('python is awesome\njava is cool\n')

# 출력 결과를 확인합니다.
print(stdout)

이 예제는 grep python 명령어를 실행하며, python이라는 문자열이 포함된 행만 출력합니다. stdin=subprocess.PIPE를 설정하여 프로세스에 직접 입력을 전달합니다.

주요 메서드와 매개변수

  • communicate(input=None): 프로세스에 입력을 전달하고 출력을 기다립니다.
  • wait(): 프로세스가 종료될 때까지 기다립니다.
  • terminate(): 프로세스를 종료합니다.
  • kill(): 프로세스를 강제로 종료합니다.

입력 및 출력을 다루는 방법

subprocess 모듈은 명령어의 입력 및 출력을 다양한 방식으로 제어할 수 있습니다.

명령어 입력 제공하기

import subprocess

process = subprocess.Popen(['sort'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True)
stdout, stderr = process.communicate('banana\napple\ncherry\n')

print(stdout)  # 출력: apple\nbanana\ncherry\n

이 예제는 sort 명령어를 실행하고, 표준 입력으로 문자열을 전달하여 정렬된 결과를 출력합니다.

표준 출력 캡처하기

import subprocess

result = subprocess.run(['df', '-h'], capture_output=True, text=True)
print(result.stdout)  # 디스크 사용량 정보를 출력합니다.

df -h 명령어를 실행하여 디스크 사용량 정보를 출력합니다. capture_output=True를 설정하면 명령어의 출력을 캡처합니다.

에러 처리 및 예외 처리

subprocess 모듈을 사용할 때 발생할 수 있는 에러와 예외를 처리하는 방법도 중요합니다.

CalledProcessError 예외

명령어가 비정상적으로 종료되면 CalledProcessError 예외가 발생할 수 있습니다.

import subprocess

try:
subprocess.run(['false'], check=True)
except subprocess.CalledProcessError as e:
print(f'명령어 실행 실패: {e}')

이 예제는 false 명령어를 실행하고, 실패 시 예외를 처리합니다. false 명령어는 항상 실패하므로 예외가 발생합니다.

TimeoutExpired 예외

명령어 실행이 제한 시간을 초과할 경우 TimeoutExpired 예외가 발생합니다.

import subprocess

try:
subprocess.run(['sleep', '10'], timeout=1)
except subprocess.TimeoutExpired as e:
print(f'명령어 실행 시간 초과: {e}')

이 예제는 sleep 10 명령어를 실행하되, 1초 후에 제한 시간이 초과하여 예외가 발생합니다.

참고문서

이 문서들은 subprocess 모듈의 기능과 사용 방법에 대한 공식적인 참고 자료를 제공합니다.

728x90
반응형