Python subprocess 모듈 기능 과 일반적인 용법 인 스 턴 스 상세 설명

본 논문 의 사례 는 Python subprocess 모듈 기능 과 일반적인 용법 을 서술 하 였 다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
프로필
subprocess 는 최초 로 2.4 버 전에 도입 되 었 다.하위 프로 세 스 를 만 들 고 파 이 프 를 통 해 입력/출력/오 류 를 연결 하 며 반환 값 을 얻 을 수 있 습 니 다.
subprocess 는 여러 개의 오래된 모듈 과 함 수 를 교체 하 는 데 사 용 됩 니 다.
  • os.system
  • os.spawn*
  • os.popen*
  • popen2.*
  • commands.*
  • python 을 실행 할 때,우 리 는 모두 프로 세 스 를 만 들 고 실행 합 니 다.Liux 의 한 프로 세 스 는 하위 프로 세 스 를 fork 하고,이 하위 프로 세 스 exec 를 다른 프로그램 으로 만 들 수 있 습 니 다.python 에서 표준 라 이브 러 리 의 subprocess 패 키 지 를 통 해 하위 프로 세 스 를 fork 하고 외부 프로그램 을 실행 합 니 다.subprocess 패키지 에 서 는 하위 프로 세 스 를 만 드 는 함수 가 여러 개 정의 되 어 있 습 니 다.이 함수 들 은 각각 다른 방식 으로 하위 프로 세 스 를 만 듭 니 다.원 하 는 것 은 필요 에 따라 선택 하여 사용 할 수 있 습 니 다.또한 subprocess 는 표준 흐름(standard stream)과 파이프(pipe)를 관리 하 는 도 구 를 제공 하여 프로 세 스 간 에 텍스트 통신 을 사용 합 니 다.
    2.기 존 모듈 의 사용
    1.os.system()
    운영 체제 명령 을 실행 하고 결 과 를 화면 에 출력 하 며 명령 실행 상태 만 되 돌려 줍 니 다(0:성공,0:실패 가 아 닙 니 다)
    
    import os
    >>> a = os.system("df -Th")
    Filesystem   Type  Size Used Avail Use% Mounted on
    /dev/sda3   ext4  1.8T 436G 1.3T 26% /
    tmpfs     tmpfs  16G   0  16G  0% /dev/shm
    /dev/sda1   ext4  190M 118M  63M 66% /boot
    >>> a
    0     # 0       
    #        
    >>> res = os.system("list")
    sh: list: command not found
    >>> res
    32512    #     0       
    
    
    2. os.popen()
    운영 체제 명령 을 실행 하면 결 과 를 메모리 에 저장 하고read()방법 으로 읽 을 수 있 습 니 다.
    
    import os
    >>> res = os.popen("ls -l")
    #          
    >>> print res
    <open file 'ls -l', mode 'r' at 0x7f02d249c390>
    #  read()    
    >>> print res.read()
    total 267508
    -rw-r--r-- 1 root root  260968 Jan 27 2016 AliIM.exe
    -rw-------. 1 root root   1047 May 23 2016 anaconda-ks.cfg
    -rw-r--r-- 1 root root  9130958 Nov 18 2015 apache-tomcat-8.0.28.tar.gz
    -rw-r--r-- 1 root root     0 Oct 31 2016 badblocks.log
    drwxr-xr-x 5 root root   4096 Jul 27 2016 certs-build
    drwxr-xr-x 2 root root   4096 Jul 5 16:54 Desktop
    -rw-r--r-- 1 root root   2462 Apr 20 11:50 Face_24px.ico
    
    
    3.subprocess 모듈
    1、subprocess.run()
    
    >>> import subprocess
    # python                
    >>> subprocess.run(["df","-h"])
    Filesystem      Size Used Avail Use% Mounted on
    /dev/mapper/VolGroup-LogVol00
               289G  70G 204G 26% /
    tmpfs         64G   0  64G  0% /dev/shm
    /dev/sda1       283M  27M 241M 11% /boot
    CompletedProcess(args=['df', '-h'], returncode=0)
    #     Linux shell    , :       ,shell=True
    >>> subprocess.run("df -h|grep /dev/sda1",shell=True)
    /dev/sda1       283M  27M 241M 11% /boot
    CompletedProcess(args='df -h|grep /dev/sda1', returncode=0)
    
    
    2、subprocess.call()
    명령 을 실행 하고 명령 의 결과 와 실행 상 태 를 되 돌려 줍 니 다.0 또는 0 이 아 닙 니 다.
    
    >>> res = subprocess.call(["ls","-l"])
        28
    -rw-r--r-- 1 root root   0 6  16 10:28 1
    drwxr-xr-x 2 root root 4096 6  22 17:48 _1748
    -rw-------. 1 root root 1264 4  28 20:51 anaconda-ks.cfg
    drwxr-xr-x 2 root root 4096 5  25 14:45 monitor
    -rw-r--r-- 1 root root 13160 5   9 13:36 npm-debug.log
    #       
    >>> res
    0
    
    
    3、subprocess.check_call()
    명령 을 실행 하고 결과 와 상 태 를 되 돌려 줍 니 다.정상 은 0 이 고 실행 오 류 는 이상 을 던 집 니 다.
    
    >>> subprocess.check_call(["ls","-l"])
        28
    -rw-r--r-- 1 root root   0 6  16 10:28 1
    drwxr-xr-x 2 root root 4096 6  22 17:48 _1748
    -rw-------. 1 root root 1264 4  28 20:51 anaconda-ks.cfg
    drwxr-xr-x 2 root root 4096 5  25 14:45 monitor
    -rw-r--r-- 1 root root 13160 5   9 13:36 npm-debug.log
    0
    >>> subprocess.check_call(["lm","-l"])
    Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
     File "/usr/lib64/python2.7/subprocess.py", line 537, in check_call
      retcode = call(*popenargs, **kwargs)
     File "/usr/lib64/python2.7/subprocess.py", line 524, in call
      return Popen(*popenargs, **kwargs).wait()
     File "/usr/lib64/python2.7/subprocess.py", line 711, in __init__
      errread, errwrite)
     File "/usr/lib64/python2.7/subprocess.py", line 1327, in _execute_child
      raise child_exception
    OSError: [Errno 2] No such file or directory
    
    
    4、subprocess.getstatusoutput()
    문자열 형식의 명령 을 받 고 원 그룹 형식의 결 과 를 되 돌려 줍 니 다.첫 번 째 요 소 는 명령 실행 상태 이 고 두 번 째 요 소 는 실행 결과 입 니 다.
    
    #    
    >>> subprocess.getstatusoutput('pwd')
    (0, '/root')
    #    
    >>> subprocess.getstatusoutput('pd')
    (127, '/bin/sh: pd: command not found')
    
    
    5、subprocess.getoutput()
    문자열 형식의 명령 을 받 아 실행 결 과 를 되 돌려 줍 니 다.
    
    >>> subprocess.getoutput('pwd')
    '/root'
    
    
    6、subprocess.check_output()
    인쇄 대신 명령 을 실행 하고 실행 결 과 를 되 돌려 줍 니 다.
    
    >>> res = subprocess.check_output("pwd")
    >>> res
    b'/root
    ' #
    4.subprocess.Popen()
    사실 상기 subprocess 에서 사용 하 는 방법 은 모두 subprocess.popen 에 대한 패키지 입 니 다.다음은 이 popen 방법 을 살 펴 보 겠 습 니 다.
    1、stdout
    표준 출력
    
    >>> res = subprocess.Popen("ls /tmp/yum.log", shell=True, stdout=subprocess.PIPE) #     
    >>> res.stdout.read()  #     
    b'/tmp/yum.log
    ' res.stdout.close() #
    2、stderr
    표준 오류
    
    >>> import subprocess
    >>> res = subprocess.Popen("lm -l",shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
    #       
    >>> res.stdout.read()
    b''
    #          
    >>> res.stderr.read()
    b'/bin/sh: lm: command not found
    '
    메모:위 에서 언급 한 표준 출력 은 왜 모두 subprocess.PIPE 와 같 아야 합 니까?이것 은 무엇 입 니까?원래 이것 은 파이프 입 니 다.이것 은 그림 을 그 려 서 설명 해 야 합 니 다.

    4、poll()
    명령 이 실행 되 었 는 지 확인 하고 실행 이 끝 난 후 실행 결 과 를 되 돌려 줍 니 다.실행 이 끝나 지 않 았 습 니 다.None 로 돌아 갑 니 다.
    
    >>> res = subprocess.Popen("sleep 10;echo 'hello'",shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
    >>> print(res.poll())
    None
    >>> print(res.poll())
    None
    >>> print(res.poll())
    0
    
    
    5、wait()
    명령 이 실 행 될 때 까지 기다 리 고 결과 상 태 를 되 돌려 줍 니 다.
    
    >>> obj = subprocess.Popen("sleep 10;echo 'hello'",shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
    >>> obj.wait()
    #        
    0
    
    
    6、terminate()
    프로 세 스 종료
    
    import subprocess
    >>> res = subprocess.Popen("sleep 20;echo 'hello'",shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
    >>> res.terminate() #     
    >>> res.stdout.read()
    b''
    
    
    7、pid
    현재 실행 중인 하위 셸 프로그램의 프로 세 스 번 호 를 가 져 옵 니 다.
    
    import subprocess
    >>> res = subprocess.Popen("sleep 5;echo 'hello'",shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
    >>> res.pid #     linux shell      
    2778
    
    
    파 이 썬 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
    본 논문 에서 말 한 것 이 여러분 의 Python 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

    좋은 웹페이지 즐겨찾기