subprocess.run() 함수는 파이썬에서 외부 명령어를 실행하고 그결과를 다루는 데 유용한 도구입니다.
안녕하세요. 오늘은 파이썬의 subprocess.run() 함수에 대한 내용을 주제로 포스팅하려고 합니다.
이 함수를 사용하여 다른 프로그램이나 명령어를 실행하고 그 결과를 가져와서 처리하는 방법에 대해 살펴보겠습니다.
subprocess.run() 함수란?
subprocess.run() 함수는 파이썬 subprocess 모듈에서 제공하는 함수 중 하나로, 외부 프로세스를 실행하고 제어하는 데 사용됩니다. 이 함수는 파이썬 3.5 이상에서 사용 가능하며, 이전 버전에서는 사용할 수 없습니다.
함수의 특징
- 외부 프로세스 실행
subprocess.run() 함수는 지정된 명령어나 실행 파일을 외부 프로세스로 실행합니다. - 블록킹
기본적으로 subprocess.run() 함수는 외부 프로세스의 실행을 기다린 후 완료됩니다. 즉, 외부 프로세스가 실행되고 종료될 때까지 파이썬 코드가 블록됩니다. - 입출력 제어
함수의 stdin, stdout, stderr 인수를 통해 표준 입력 및 출력 스트림을 제어할 수 있습니다. 각 인수에는 파일 객체나 파이프(pipe)를 지정할 수 있습니다. - 실행 결과 반환
실행이 완료된 후, 함수는 CompletedProcess 객체를 반환합니다. 이 객체에는 외부 프로세스의 종료 코드, 표준 출력 및 표준 에러 출력과 같은 정보가 포함되어 있습니다.
함수의 기본 사용법
import subprocess
# 실행할 명령어나 실행 파일 지정
command = ["ls", "-l"]
# 외부 프로세스 실행
result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
# 실행 결과 확인
print("표준 출력:", result.stdout)
print("표준 에러:", result.stderr)
print("종료 코드:", result.returncode)
위의 예제에서는 ls -l 명령어를 실행하고 그 결과를 가져오는 간단한 예제를 보여줍니다.
subprocess.run() 함수는 외부 프로세스를 실행하고, 해당 프로세스의 종료 코드 및 출력 내용을 쉽게 처리할 수 있는 간단한 방법을 제공합니다.
subprocess.run() 함수의 활용 예제
1. 외부 명령어 실행하기
import subprocess
# 간단한 명령어 실행 예제
result = subprocess.run(["ls", "-l"], stdout=subprocess.PIPE, text=True)
# 실행 결과 출력
print(result.stdout)
위의 예제에서는 subprocess.run(["ls", "-l"], stdout=subprocess.PIPE, text=True) 코드를 사용하여 "ls -l" 명령어를 실행합니다. stdout=subprocess.PIPE 옵션을 사용하여 표준 출력을 캡처하고, text=True로 설정하여 텍스트 모드로 결과를 가져옵니다.
2. 외부 프로그램 실행 및 에러 처리
import subprocess
try:
# 존재하지 않는 명령어 실행
result = subprocess.run(["nonexistent_command"], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
except subprocess.CalledProcessError as e:
print(f"에러 발생: {e}")
print(f"에러 출력:\n{e.stderr}")
이 예제에서는 subprocess.run(["nonexistent_command"], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) 코드를 사용하여 "nonexistent_command"를 실행합니다. check=True를 사용하면 명령어 실행 중에 발생한 오류를 확인하고, stdout=subprocess.PIPE 및 stderr=subprocess.PIPE로 표준 출력과 표준 오류를 캡처합니다.
3. 표준 입력으로 데이터 주고받기
import subprocess
# 표준 입력으로 데이터 주고받기 예제
input_data = "Hello, subprocess!"
result = subprocess.run(["echo"], input=input_data, stdout=subprocess.PIPE, text=True)
# 실행 결과 출력
print(result.stdout)
이 예제에서는 subprocess.run(["echo"], input=input_data, stdout=subprocess.PIPE, text=True) 코드를 사용하여 "echo" 명령어를 실행하고, input_data로 지정한 데이터를 표준 입력으로 전달합니다. 그런 다음 stdout=subprocess.PIPE를 통해 실행 결과를 캡처합니다.
4. 환경 변수 설정하여 실행
import subprocess
# 환경 변수 설정하여 실행 예제
env = {"MY_VARIABLE": "12345"}
result = subprocess.run(["echo", "$MY_VARIABLE"], env=env, stdout=subprocess.PIPE, shell=True, text=True)
# 실행 결과 출력
print(result.stdout)
이 예제에서는 subprocess.run(["echo", "$MY_VARIABLE"], env=env, stdout=subprocess.PIPE, shell=True, text=True) 코드를 사용하여 "echo $MY_VARIABLE" 명령어를 실행합니다. env 변수를 통해 환경 변수를 설정하고, shell=True를 사용하여 셸을 통해 명령어를 실행하며 결과를 stdout=subprocess.PIPE를 통해 가져옵니다.
이러한 예제들은 subprocess.run() 함수를 사용하여 외부 명령어나 프로그램을 실행하고 그 결과를 처리하는 기본적인 방법을 보여줍니다.
subprocess.run() 함수의 옵션과 설정
subprocess.run() 함수는 다양한 옵션과 설정을 통해 외부 프로세스를 실행하고 제어할 수 있습니다.
- args
실행할 명령어와 인수를 리스트로 지정합니다. 예를 들어, ["ls", "-l"]는 "ls -l" 명령어를 실행합니다. - stdin
표준 입력을 제어합니다. 기본값은 None이며, 입력을 사용하지 않을 경우에는 이대로 둡니다. - stdout
표준 출력을 제어합니다. 기본값은 None이며, subprocess.PIPE로 설정하면 표준 출력을 캡처할 수 있습니다. - stderr
표준 오류 출력을 제어합니다. 기본값은 None이며, subprocess.PIPE로 설정하면 표준 오류 출력을 캡처할 수 있습니다. - shell
명령어를 셸에서 실행할지 여부를 결정합니다. 기본값은 False이며, True로 설정하면 명령어를 셸에서 실행합니다. - text
결과를 텍스트 모드로 처리할지 여부를 결정합니다. 기본값은 False이며, True로 설정하면 텍스트 모드로 결과를 반환합니다. - check
실행 중에 오류가 발생하면 예외를 발생시킬지 여부를 결정합니다. 기본값은 False이며, True로 설정하면 오류 발생 시
CalledProcessError 예외가 발생합니다. - cwd
작업 디렉터리를 설정합니다. 명령어를 실행할 디렉터리를 지정할 수 있습니다. - env
환경 변수를 설정합니다. 실행 환경을 커스터마이징할 때 사용됩니다. - timeout
명령어 실행 시간 제한을 설정합니다. 설정한 시간 동안 명령어가 실행되지 않으면 TimeoutExpired 예외가 발생합니다. - universal_newlines
text와 유사하게 동작하며, 텍스트 모드로 처리할지 여부를 결정합니다. 기본값은 False입니다. - capture_output
표준 출력과 표준 오류 출력을 함께 캡처할지 여부를 결정합니다. Python 3.7 이상에서 사용 가능합니다.
이러한 옵션과 설정을 조합하여 subprocess.run() 함수를 사용하면 외부 명령어를 실행하고 결과를 제어할 수 있습니다.
subprocess.run() 함수 사용시 주의사항
1. 보안 주의
외부 명령어를 실행할 때, 사용자 입력 등 외부에서 입력되는 값에 대한 검증이 필요합니다. 외부 명령어를 조작할 수 있는 입력값이 있다면 보안 문제가 발생할 수 있습니다. 따라서 입력값을 검증하고, 사용자 입력을 신뢰할 수 없는 경우에는 필요한 검증과 처리를 해야 합니다.
2. 셸 인젝션 방지
shell=True로 설정하여 외부 명령어를 셸에서 실행할 때, 외부 입력값을 포함한 명령어가 셸 인젝션 공격에 취약할 수 있습니다. 가능하면 shell=False로 설정하여 셸 인젝션 공격을 예방하십시오.
3. 경로 검색 경로 지정
외부 명령어의 경로를 명시적으로 지정하는 것이 좋습니다. 시스템 경로에 의존하지 않도록 합니다. 이렇게 하면 보안 및 이식성 측면에서 유리합니다.
4. 환경 변수 관리
필요한 경우 env 매개변수를 사용하여 자식 프로세스의 환경 변수를 관리할 수 있습니다. 필요한 환경 변수를 설정하거나, 외부 프로세스의 환경을 정의하여 원하는대로 커스터마이징할 수 있습니다.
5. Blocking 처리 주의
subprocess.run()은 외부 명령어가 실행될 때까지 블로킹됩니다. 따라서 긴 시간이 걸리는 작업을 실행하는 경우 메인 프로그램이 멈추는 현상을 유의해야 합니다. 이 경우 스레드 또는 비동기 프로그래밍을 고려할 수 있습니다.
6. 리턴 코드 확인
외부 명령어 실행이 완료되면 subprocess.CompletedProcess 객체가 반환됩니다. 이 객체에서는 리턴 코드(returncode)를 확인하여 명령어의 실행 상태를 파악할 수 있습니다.
7. 표준 출력 및 오류 처리
stdout 및 stderr를 캡처하는 경우, 결과를 적절하게 처리하고 보고하는 것이 중요합니다. 캡처한 내용을 적절한 방식으로 로깅하거나 분석하는 것이 좋습니다.
8. Timeout 설정
긴 시간이 걸리는 명령어를 실행할 때, timeout 매개변수를 사용하여 실행 시간 제한을 설정할 수 있습니다. 이를 통해 무한 대기 상태를 방지할 수 있습니다.
9. 호환성
Python 3.5 이상에서 subprocess.run() 함수를 사용할 수 있지만, Python 버전에 따라 일부 기능이 지원되지 않을 수 있으므로 호환성을 확인하고 사용하는 것이 좋습니다.
subprocess.run() 함수를 안전하게 사용하기 위해서는 위의 주의사항을 준수하여 외부 명령어를 실행하고 결과를 처리해야 합니다.
최종 정리
오늘은 파이썬 subprocess.run() 함수에 대한 내용을 주제로 정리해 보았습니다. 이를 통해 파이썬 프로그램에서 외부 프로세스를 호출하고 제어할 수 있습니다.
외부 명령어를 실행할 때 보안 및 안정성에 주의하고, 필요한 설정과 옵션을 사용하여 원하는 동작을 달성하세요. 파이썬 subprocess 모듈은 다양한 시스템 작업을 자동화하고 확장할 때 매우 유용한 도구입니다.
감사합니다.
'Python > python' 카테고리의 다른 글
파이썬 subprocess.Popen() 함수를 활용하여 프로세스 관리하기 (1) | 2024.01.22 |
---|---|
파이썬을 이용하여 환율 정보 데이터 수집하기 (0) | 2024.01.10 |
파이썬 subprocess 모듈을 이용해서 외부 프로그램 실행하기 (1) | 2023.10.31 |
파이썬 requests 모듈을 활용한 HTTP 요청 통신하기 (0) | 2023.10.30 |
파이썬 time.sleep() 함수를 활용해서 시간 지연하기 (0) | 2023.10.29 |