subprocess.run() 개요
subprocess.run()은 명령을 실행하고 명령이 완료될 때까지 기다린 다음 결과를 CompletedProcess 객체로 반환합니다
기본 호출 형식
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None,
capture_output=False, shell=False, cwd=None, timeout=None,
check=False, encoding=None, errors=None, text=None, env=None,
universal_newlines=None, **other_popen_kwargs)
주요 기능
- 명령 실행 및 결과 캡처:
- 명령 실행 후 출력(stdout), 에러(stderr), 종료 코드(returncode) 등을 캡처할 수 있음.
- 기본적으로 출력이 캡처되지 않음.
- 고급 옵션:
- 입출력 설정: stdin, stdout, stderr
- 환경 변수 설정: env
- 타임아웃 설정: timeout
- 에러 처리: check
중요 매개변수
1. args
- 실행할 명령어와 인자를 리스트 형태로 제공.
- subprocess.run(["ls", "-l"])
2. capture_output
- True로 설정 시, stdout과 stderr를 캡처하여 CompletedProcess 객체에 저장.
- result = subprocess.run(["ls", "-l"], capture_output=True, text=True) print(result.stdout)
3. text / universal_newlines
- 출력 데이터를 텍스트 모드로 처리.
- subprocess.run(["ls", "-l"], capture_output=True, text=True)
4. shell
- 명령어를 셸에서 실행할지 여부(True/False).
- subprocess.run("echo Hello World", shell=True
5. timeout
- 명령 실행 제한 시간(초 단위).
- subprocess.run(["sleep", "10"], timeout=5)
6. check
- 종료 코드가 0이 아닐 경우 예외(CalledProcessError) 발생.
- subprocess.run("exit 1", shell=True, check=True)
7. env
- 새 프로세스의 환경 변수를 딕셔너리로 설정.
- env = {"MY_VAR": "value"} subprocess.run(["printenv", "MY_VAR"], env=env, text=True)
사용 예제
기본 명령 실행
subprocess.run(["ls", "-l"])
출력 캡처
result = subprocess.run(["ls", "-l"], capture_output=True, text=True)
print(result.stdout)
에러 처리
try:
subprocess.run("exit 1", shell=True, check=True)
except subprocess.CalledProcessError as e:
print(f"Error: {e}"
타임아웃 설정
subprocess.run(["sleep", "10"], timeout=5) # 5초 후 TimeoutExpired 예외 발생
환경 변수 전달
env = {"CUSTOM_VAR": "value"}
result = subprocess.run(["printenv", "CUSTOM_VAR"], env=env, capture_output=True, text=True)
print(result.stdout)
주요 변경 사항
- 버전 3.5: subprocess.run() 추가.
- 버전 3.6: encoding 및 errors 매개변수 추가.
- 버전 3.7: universal_newlines의 별칭으로 text 매개변수 추가.
- 버전 3.12: Windows에서 shell=True 사용 시 보안 강화.
참고
'Python > study' 카테고리의 다른 글
@wrap (0) | 2025.01.15 |
---|---|
unittest 모듈 (0) | 2024.12.08 |
@staticmethod (0) | 2024.12.08 |
ast.literal_eval() (0) | 2024.12.08 |
__str__와 __repr__ (0) | 2024.12.08 |