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
모듈의 기능과 사용 방법에 대한 공식적인 참고 자료를 제공합니다.
'Study Information Technology' 카테고리의 다른 글
Spring Boot의 헬스 체크 애플리케이션 상태를 모니터링하는 방법 (0) | 2024.08.19 |
---|---|
Python의 함수형 프로그래밍 도구 탐색 map filter reduce (0) | 2024.08.19 |
파이썬의 이터레이터 구현과 이터레이터 프로토콜 사용자 정의 반복 패턴 지원 (0) | 2024.08.19 |
Python의 shutil을 활용한 고급 파일 작업 (0) | 2024.08.19 |
Python의 traceback을 활용한 상세한 에러 보고로 디버깅 개선하기 (1) | 2024.08.19 |