티스토리 뷰
파이선으로 외부 명령어 실행
파이선으로 외부 명령어를 실행하는 방법은 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 |
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- hbase
- SQL
- nodejs
- error
- 알고리즘
- Tez
- yarn
- 다이나믹
- SPARK
- 백준
- build
- 파이썬
- emr
- 오류
- S3
- 하둡
- java
- 정올
- HDFS
- Python
- oozie
- Hadoop
- mysql
- airflow
- 하이브
- HIVE
- Linux
- bash
- AWS
- ubuntu
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함