본문 바로가기
python

[python] subprocess 모듈을 이용한 명령어 실행

by hs_seo 2015. 6. 11.

 

파이선으로 외부 명령어 실행

파이선으로 외부 명령어를 실행하는 방법은 subprocess 모듈을 사용한다.

subprocess 모듈은 2.4 버전부터 추가 되었으며 기존에 사용하던 다른 모듈을 대체한다.

 

os.system

os.spawn*

os.popen*

popen2.*

command.*

 

subprocess.Popen()

 

subprocess Popen() 메소드를 이용하여 로컬 프로그램, 명령어를 사용한다.

Popen()shell 파라미터는 기본이 False이고, 명령어를 문자열로 쉘에 전달하려면 True로 설정해야 한다.

 

#!/usr/bin/python
# -*- coding: utf-8 -*-
import subprocess
import shlex

# 문자열 명령어 실행
def subprocess_open(command):
    popen = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
    (stdoutdata, stderrdata) = popen.communicate()
    return stdoutdata, stderrdata

# 배치 파일 등 실행
def subprocess_open_when_shell_false(command):
    popen = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    (stdoutdata, stderrdata) = popen.communicate()
    return stdoutdata, stderrdata

# 문자열 명령어 실행
# shell 변수를 false 로 줄경우(default가 false) 명령어를 shelx.split() 함수로 프로세스가 인식 가능하게 잘라 주어야 함
def subprocess_open_when_shell_false_with_shelx(command):
    popen = subprocess.Popen(shlex.split(command), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    (stdoutdata, stderrdata) = popen.communicate()
    return stdoutdata, stderrdata

# 커맨드 리스트 처리
# 커맨드 리스트를 이전 처리의 결과(stdout)를 다음 처리의 입력(stdin)으로 입력하여 순차적으로 처리
def subprocess_pipe(cmd_list):
    prev_stdin = None
    last_p = None
    
    for str_cmd in cmd_list:
        cmd = str_cmd.split()
        last_p = subprocess.Popen(cmd, stdin=prev_stdin, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        prev_stdin = last_p.stdout
    
    (stdoutdata, stderrdata) = last_p.communicate()
    return stdoutdata, stderrdata


def main():
    print subprocess_open('echo "aaa" | wc -l > a.txt')
    # 실행결과
    # --> ('', '') 파일 a.txt 생성
    
    print subprocess_open_when_shell_false("./test.sh")
    # test.sh
    # #!/bin/bash
    # echo "aaa" | wc -l > b.txt
    # 실행결과
    # --> ('', '') 파일 b.txt 생성
    
    print subprocess_open_when_shell_false_with_shelx('echo -n "aaa"')
    # 실행결과
    # ('aaa', '')
    
    print subprocess_open_when_shell_false_with_shelx('echo "aaa" | wc -l')
    # 실행결과
    # ('aaa | wc -l\n', '')
    
    print subprocess_pipe(['echo "aaa"', "wc -l"])
    # 실행결과
    # ('1\n', '')
    
if __name__ == "__main__":
    main()        

 

 

참고

https://docs.python.org/2/library/subprocess.html#module-subprocess

http://stackoverflow.com/questions/3172470/actual-meaning-of-shell-true-in-subprocess

http://stackoverflow.com/questions/3172470/actual-meaning-of-shell-true-in-subprocess

 

 

 


반응형