python
[python] subprocess 모듈을 이용한 명령어 실행
hs_seo
2015. 6. 11. 17:48
파이선으로 외부 명령어 실행
파이선으로 외부 명령어를 실행하는 방법은 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
반응형