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

2015. 6. 11. 17:48·python

 

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

파이선으로 외부 명령어를 실행하는 방법은 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
'python' 카테고리의 다른 글
  • [Python] http 리퀘스트 처리하기
  • [python] 문자열 치환 방법
  • 파이썬의 중요 특징(클로저함수, 장식자, 생성기, 코루틴)
  • [python][xlswriter] xlsxwriter 의 메모리 점유해제를 위한 constant_memory 모드 설정
hs_seo
hs_seo
Hello World!
    반응형
  • hs_seo
    개발자로 살아남기
    hs_seo
  • 전체
    오늘
    어제
    • 전체 (1139)
      • 개발자 (21)
        • 개발에 유의할 점 (0)
        • 면접 (5)
      • IT 소식 (5)
        • 업계 (1)
      • java (51)
        • 디자인패턴 (3)
        • apache-common (1)
      • 개념 (47)
        • 자료구조 (4)
        • 함수형사고 (8)
        • 디자인패턴 (1)
      • 데이터분석 (1)
      • python (67)
        • 코드조각 (12)
        • 라이브러리 (2)
      • 빅데이터 (417)
        • zookeeper (5)
        • hadoop (78)
        • hdfs (12)
        • hive (127)
        • hbase (16)
        • spark (40)
        • scala (4)
        • trino (3)
        • oozie (41)
        • Hue (9)
        • R (5)
        • sqoop (6)
        • flume (3)
        • elasticsearch (2)
        • airflow (15)
        • kafka (3)
        • kubernetes (10)
        • openstack (3)
        • flink (2)
        • redis (2)
      • 빅데이터 강좌 (2)
      • 알고리즘 (131)
        • 알고리즘 (1)
        • 백준 (61)
        • 정올 (41)
        • 더블릿 (5)
        • 프로그래머스 (1)
      • 프로그래밍 언어 (30)
        • go (4)
        • js (9)
        • .Net (6)
        • Jsp (1)
        • ansible (3)
        • terraform (6)
      • Tools (56)
        • docker (2)
        • macbook (6)
        • maven (3)
        • sublime (1)
      • 프레임워크 (25)
        • [JS] angularjs (2)
        • [JS] node.js (19)
        • [Java] spring (2)
        • Android (2)
      • 데이타베이스 (43)
        • SQLD (5)
        • Oracle (1)
        • MySQL (8)
        • ADsP (2)
      • 리눅스 (25)
        • Bash (61)
      • GCP (5)
      • AWS (34)
        • EC2 (2)
        • EMR (14)
      • 정보보안기사 (4)
        • 네트워크 (1)
      • 개인 (80)
        • 업무실수 (0)
        • 책 (9)
        • 교육 (3)
        • 여행 (17)
        • 영화 (12)
        • 음악 (2)
        • 피규어 (4)
        • 게임 (3)
        • 생각 (7)
        • 기타 (10)
        • 좋은글 (5)
        • 좋은 사이트 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

    • 빅데이터-하둡,하이브로 시작하기
    • 빅데이터-스칼라, 스파크로 시작하기
    • Kaggle에서 파이썬으로 데이터 분석 시작하기
    • 쉘스크립트 개발 시작하기
    • 개발자가 데이터 분석 준전문가 되기
    • 데브쿠마
  • 공지사항

  • 인기 글

  • 태그

    하이브
    Tez
    하둡
    bash
    airflow
    nodejs
    HIVE
    build
    emr
    ubuntu
    java
    yarn
    알고리즘
    오류
    백준
    k8s
    AWS
    hbase
    Python
    S3
    HDFS
    Linux
    파이썬
    Hadoop
    정올
    oozie
    SPARK
    다이나믹
    error
    mysql
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
hs_seo
[python] subprocess 모듈을 이용한 명령어 실행
상단으로

티스토리툴바