파이선으로 외부 명령어 실행
파이선으로 외부 명령어를 실행하는 방법은 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
반응형
'python' 카테고리의 다른 글
[Python] http 리퀘스트 처리하기 (2) | 2015.06.23 |
---|---|
[python] 문자열 치환 방법 (0) | 2015.06.12 |
파이썬의 중요 특징(클로저함수, 장식자, 생성기, 코루틴) (0) | 2015.02.09 |
[python][xlswriter] xlsxwriter 의 메모리 점유해제를 위한 constant_memory 모드 설정 (0) | 2015.02.04 |
[파이선2] 파이선2의 한글 인코딩 비교하기 (2) | 2015.01.12 |