subprocess 모듈파이썬의 subprocess 모듈은 새로운 프로세스를 생성하고, 그 프로세스의 입력/출력 파이프에 연결하며, 반환 코드(return code)를 얻는 데 사용됩니다. 즉, 파이썬 스크립트 내에서 외부 셸 명령어(Shell Command)나 다른 프로그램(Program)을 실행하고 제어할 수 있게 해주는 강력한 도구입니다. 이 모듈은 구형인 os.system이나 os.spawn* 함수들을 대체하며, 더욱 안전하고 유연한 방법으로 외부 프로세스를 다룹니다.
subprocess 모듈의 핵심 클래스와 함수는 다음과 같습니다.
subprocess.run() 🏃:
가장 많이 사용되는 함수로, 외부 명령어를 실행하고 명령이 완료될 때까지 기다립니다. 명령의 반환 코드와 출력(stdout, stderr)을 한 번에 가져올 수 있어, 간단한 명령어 실행에 매우 편리합니다.
subprocess.run(["ls", "-l"])은 현재 디렉터리의 파일 목록을 상세하게 출력합니다.capture_output=True 옵션을 사용하면 출력을 변수에 저장할 수 있습니다.text=True 옵션을 통해 출력을 텍스트(문자열)로 디코딩할 수 있습니다.subprocess.Popen() ⚙️:
외부 명령어를 실행하지만, 명령이 완료될 때까지 기다리지 않고 즉시 제어권을 반환합니다. 이 덕분에 여러 프로세스를 동시에 실행하거나, 비동기적으로(Asynchronously) 외부 프로세스와 통신해야 할 때 유용합니다. Popen 객체를 통해 wait() 메서드로 완료를 기다리거나, communicate() 메서드로 데이터를 보내고 받을 수 있습니다.
shell=True 옵션:
이 옵션을 사용하면 외부 명령어를 셸(Shell)을 통해 실행합니다. shell=True는 파이프(pipe)(|), 리디렉션(redirection)(<, >)과 같은 셸 기능들을 사용할 수 있게 해주지만, 보안상의 위험이 있을 수 있습니다. 예를 들어, 사용자로부터 받은 입력을 그대로 shell=True와 함께 사용하면 셸 인젝션(Shell Injection) 공격에 취약해질 수 있습니다. 따라서, 특별한 이유가 없다면 shell=True는 사용하지 않는 것이 좋습니다.
subprocess 사용 예시다음은 subprocess 모듈의 활용 예시입니다.
import subprocess
# 1. 간단한 명령어 실행 및 출력 확인 (subprocess.run)
# capture_output=True로 표준 출력을 캡처하고, text=True로 문자열로 변환
result = subprocess.run(['echo', 'Hello, Subprocess!'], capture_output=True, text=True)
print(f"반환 코드: {result.returncode}")
print(f"표준 출력: {result.stdout.strip()}")
# 2. 파이프(|)를 사용하는 명령어 실행 (shell=True)
# 보안상의 이유로 신뢰할 수 있는 입력에만 사용 권장
try:
p = subprocess.run('ls -l | grep .py', shell=True, check=True, capture_output=True, text=True)
print("\n파이썬 파일 목록:")
print(p.stdout)
except subprocess.CalledProcessError as e:
print(f"오류 발생: {e.stderr}")
subprocess와 보안subprocess 모듈은 매우 강력하지만, 특히 사용자 입력과 함께 사용할 때는 보안에 각별히 유의해야 합니다.
shell=True의 위험성: 앞서 언급했듯이, **shell=True**는 사용자 입력이 그대로 명령어에 삽입될 경우 악성 코드가 실행될 수 있는 셸 인젝션 공격의 원인이 될 수 있습니다.['ls', '-l', file_name]과 같이 명령어와 인자를 분리하면, file_name 변수에 악성 입력이 포함되어 있어도 별도의 인자로 취급되어 셸이 실행되지 않습니다.subprocess 모듈은 파이썬 스크립트의 기능을 확장하여 시스템 수준의 작업을 수행하게 해주는 필수적인 도구입니다. 올바른 사용법을 숙지하고 보안 원칙을 준수한다면, 매우 유용하게 활용할 수 있습니다.