subprocess.Popen
(Sub Process) 함수를 사용하게 된 것은 OS의 기본기능이 생각보다 강력하다는 경험을 하게 된 뒤 사용하는 것 같습니다.
다만 요즘 트렌드는 기본 기능을 컴팩트하게 하고 추가 패키지를 많이 같고 있는 것 같습니다. OS 기본기능과 CMD, Shell 기능을 사용하기 위해한 함수 입니다. (Python Document)
사실 Sub Process 는 C언어를 사용할때는 HW나 OS의 종류에 따라 코드가 변경되야 하는 경우가 있어서 처음 C언어에서 Popen(pipe-open) 의 개념을 익히면서 사용했던 기억이 있습니다.
subprocess.Popen
은 Python에서 외부 프로그램이나 명령어를 실행할 때 사용하는 모듈입니다. Popen
은 실행 중인 프로세스와 통신하거나 데이터를 주고받을 수 있도록 강력한 기능을 제공합니다.
동작 프로세스
- 외부 명령 실행: 쉘 명령어나 프로그램을 실행
- 프로세스와 통신: 표준 입력(
stdin
), 출력(stdout
), 에러(stderr
) 스트림을 사용해 실행된 프로세스와 데이터를 주고 받음 - 비동기 실행: 프로세스를 비동기적으로 실행하여 다른 작업과 병렬로 처리
Sub Process Code
import subprocess, os
def subprocess_open(command):
popen = subprocess.Popen(command, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, shell=True, encoding='euc-kr')
(stdoutdata, stderrdata) = popen.communicate()
return stdoutdata, stderrdata
if __name__ == "__main__":
if os.name == 'Windows':
stdout, stderr = subprocess_open('dir')
elif os.name == 'posix':
stdout, stderr = subprocess_open('ls')
else:
print("OS is " + os.name)
exit()
print("[stdout]", stdout)
print("[stderr]", stderr)
시스템 Shell 에서 실행할 수 있는 명령어을 알아보겠습니다. 실행 가능한 커맨드의 종류는 사용하는 운영 체제(Windows, Linux, macOS)에 따라 다르죠.
- 공통 명령어 (Windows, Linux, macOS)
echo
: 텍스트 출력ping
: 네트워크 상태 확인
- Linux/Mac 명령어
ls
: 디렉토리 목록 보기cat
: 파일 내용 보기grep
: 특정 문자열 검색curl
: URL 요청
- Windows 명령어
dir
: 디렉토리 목록 보기tasklist
: 실행 중인 프로세스 확인type
: 파일 내용 출력
이외에 cmd 타입으로 프로그램을 만들어 연계해서 사용하기 도 편합니다. 예를 들면 메인 프로그램에서 간단한 조작이 필요한 경우가 많이 발생했습니다. 그래서 작은 실행 프로그램을 많이 만들어서 popen으로 메인 프로그램 코드를 안 고치고 대응 했었죠.
파이프라인을 이용해 프로그램 간데 데이터를 교환하기도 하는데 최근에는 이렇게 사용하는 경우는 많이 못봤습니다. 파이프라인을 이용하는 방법은 좀 길어질거 같으니 나중에 다시 다루거나 Pass 하겠습니다.