Python 외부 명령 실행 subprocess 사용 상세 정보

1. subprocess 이해

  • subeprocess모듈은python이 자체로 가지고 있는 모듈로 설치할 필요가 없고 주로 일부 모듈이나 방법을 대체하는 데 사용된다. 예를 들어os.system、os.spawn*、os.popen、commands.*기다리다
  • 외부 명령을 실행하기 위해subprocess 모듈을 우선적으로 사용
  • 1、subprocess.run() 메서드


    subprocess.run () 방법은 정부에서 추천하는 방법으로 거의 모든 일을 그것으로 완성할 수 있다.
    함수 소스는 다음과 같습니다.
    
    subprocess.run(args,
     *,
    stdin=None,
    input=None,
    stdout=None,
    stderr=None,
    shell=False,
    ced=None,
    timeout=None,
    check=False,
    enccoding=None,
    error=None)
    이 함수는 CompletedProcess 클래스(속성 전입 매개 변수와 반환 값이 있음)의 실례를 되돌려줍니다. 이 함수의 매개 변수는 매우 많기 때문에 자주 사용하는 것만 기억하면 됩니다.
    1,args: 운영체제에서 실행해야 하는 명령을 대표합니다. 문자열 형식(shell=True 요구)이거나list 목록 형식일 수 있습니다.
    2,*: 일반적으로 목록 또는 사전 유형의 가변 매개변수를 나타냅니다.
    3. stdin, stdout, stderr: 실행 가능한 프로그램의 표준 입력, 표준 출력, 표준 오류 파일 핸들을 지정합니다
    4, 셸: 프로그램이 셸에서 실행되어야 하는지를 나타낸다. 셸의 특성을 사용하려면 셸=True를 설정한다. 그러면 셸 명령의 파이프, 파일 이름 어댑터, 환경 변수 등을 사용할 수 있지만python은 셸과 유사한 모듈을 많이 제공한다. 예를 들어glob,fnmatch,os.walk()、os.path.expandvars()、os.path.expanduser () 와 shutil.
    5, check: check가 True로 설정되면 명령의 반환 값을 검사하고 반환 값이 0이면 AclledProcessError의 이상이 발생합니다.
    6,timeout: 시간 초과 시간을 설정하고, 시간 초과하면kill 하위 프로세스
    1. 셸 명령을 문자열로 실행
    
    [root@localhost python]# vim 1.py
    #!/bin/env python3
    import subprocess
    b=subprocess.run("ls -l /ltp | head -2", shell=True) #  run , b
    # total 184980
    # -rw-r--r--. 1 root root     10865 May  8 16:21 123.txt
    
    print(b)              #  run CompletedProcess 
    # CompletedProcess(args='ls -l /ltp | head -2', returncode=0)
    
    print(b.args)         #  CompletedProcess agrs , shell 
    # ls -l /ltp | head -2
    
    print(b.returncode)   #  
    # 0
    결과 전시
    [root@localhost python]# ./1.py
    total 184980
    -rw-r--r--. 1 root root     10865 May  8 16:21 123.txt
    CompletedProcess(args='ls -l/ltp | head -2', returncode=0)2
    ls -l/ltp | head -2
    0
    2. 목록을 사용하여 실행 , ,
    
    #!/bin/env python3
    import subprocess
    b = subprocess.run(["ls", "-l", "/ltp"])
    print(b)
    print(b.args)
    print(b.returncode)
    실행 결과
    [root@localhost python]# ./2.py
    total 10865
    -rw-r--r--. 1 root root     10865 May  8 16:21 123.txt
    CompletedProcess(args=['ls', '-l', '/ltp'], returncode=0)
    ['ls', '-l', '/ltp']
    0
    3. 스크립트 출력 캡처
  • 명령이 실행된 결과를 채집해야 한다면 매개 변수 stdout=subprocess를 전송할 수 있습니다.PIPE
  • 
    [root@localhost python]# cat 3.py
    #!/bin/env python3
    import subprocess
    #  stdout=subprocess.PIPE 
    b=subprocess.run("ls -l /ltp | head -2", shell=True, stdout=subprocess.PIPE)
    
    print(b.stdout)
    결과 표시
    [root@localhost python]# ./1.py
    b'total 184980-rw-r--r--. 1 root root     10865 May  8 16:21 123.txt'
    4. 이상 감지
    예제 1: 아날로그 renturncode 값이 0이 아닙니다.
    전송 매개 변수 check=True, 반환 값이 0이 아닌 경우 예외가 발생합니다.
    
    [root@localhost python]# cat 1.py
    #!/bin/env python3
    import subprocess
    b=subprocess.run("ls -l /123 | head -2 && exit 1", shell=True, stdout=subprocess.PIPE, check=True)
    print(b.returncode)
    실행 결과: CalledProcessError 유형 오류가 반환되었습니다.
    
    [root@localhost python]# ./1.py
    ls: cannot access /123: No such file or directory
    Traceback (most recent call last):
      File "./1.py", line 3, in <module>
        b=subprocess.run("ls -l /123 | head -2 && exit 1", shell=True, stdout=subprocess.PIPE, check=True)
      File "/usr/local/python3/lib/python3.7/subprocess.py", line 487, in run
        output=stdout, stderr=stderr)
    subprocess.CalledProcessError: Command 'ls -l /123 | head -2 && exit 1' returned non-zero exit status 1.
    #   CalledProcessError  
    예 2: 시뮬레이션 실행 시간 초과
    TimeoutExpired 예외로 돌아가기
    
    [root@localhost python]# vim 1.py
    #!/bin/env python3
    import subprocess
    
    b=subprocess.run("while 2>1;do sleep 1;done",timeout=3, shell=True, stdout=subprocess.PIPE, check=True)
    
    print(b.returncode)
    결과 표시
    [root@localhost python]# ./1.py
    Traceback (most recent call last):
      File "/usr/local/python3/lib/python3.7/subprocess.py", line 474, in run
        stdout, stderr = process.communicate(input, timeout=timeout)
      File "/usr/local/python3/lib/python3.7/subprocess.py", line 939, in communicate
        stdout, stderr = self._communicate(input, endtime, timeout)
      File "/usr/local/python3/lib/python3.7/subprocess.py", line 1682, in _communicate
        self._check_timeout(endtime, orig_timeout)
      File "/usr/local/python3/lib/python3.7/subprocess.py", line 982, in _check_timeout
        raise TimeoutExpired(self.args, orig_timeout)
    subprocess.TimeoutExpired: Command 'while 2>1;do sleep 1;done' timed out after 3 seconds
    During handling of the above exception, another exception occurred:
    Traceback (most recent call last):
      File "./1.py", line 3, in
        b=subprocess.run("while 2>1;do sleep 1;done",timeout=3, shell=True, stdout=subprocess.PIPE, check=True)
      File "/usr/local/python3/lib/python3.7/subprocess.py", line 479, in run
        stderr=stderr)
    subprocess.TimeoutExpired: Command 'while 2>1;do sleep 1;done' timed out after 3 seconds

    2, Popen 클래스


    1. Popen 클래스 초보 인식
    일단 Popen 클래스의 구조 함수를 보겠습니다.
    
    class Popen(
        args,
        bufsize=0,
        executable=None,
        stdin=None,
        stdout=None,
        stderr=None,
        preexec_fn=None,
        close_fds=False,
        shell=False,
        cwd=None,
        env=None,
        universal_newlines=False,
        startupinfo=None,
        creationflags=0
    ):
    매개 변수
    문자열 또는 목록 bufsize0: 버퍼 없음
    매개 변수
    문자열 또는 목록
    bufsize
    0: 버퍼 없음
    1: 행 버퍼
    추가 양수값: 버퍼 크기
    마이너스 값: 기본 시스템 버퍼를 사용합니다 (일반적으로 전체 버퍼)
    executable
    일반적으로 사용하지 않습니다.args 문자열이나 목록의 첫 번째 항목은 프로그램 이름을 표시합니다
    stdin
    stdout
    stderr
    None: 상위 상속 프로세스에 대한 리디렉션이 없습니다.
    PIPE:파이프 생성
    파일 객체
    파일 설명자(정수)
    stderr도 stdout로 설정할 수 있습니다.
    preexec_fn
    갈고리 함수,fork와exec 사이에서 실행
    close_fds
    유닉스에서 새 프로세스를 실행하기 전에 0/1/2 이외의 파일을 닫을지 여부
    윈도우즈에서 부모 프로세스를 계승하지 않거나 계승하는 파일 설명
    shell
    True라면:
    유닉스에서 args 앞에 "/bin/bash""-c"를 추가한 것과 같다
    윈도우즈에서 "cmd.exe/c"를 추가한 것과 같다
    cwd
    작업 디렉토리 설정
    env
    환경 변수 설정
    unviersal_newlines
    여러 줄 바꿈 문자가 ""로 통합됩니다.
    startupinfo
    윈도우즈에서 CreateProcess에 전달되는 구조체
    creationflags
    윈도우즈에서 CREATE_ 전달NEW_CONSOLE 자체 콘솔 창 만들기
    2. Popen 사용법
    1、subprocess.Popen([“cat”, “abc.txt”])
    2、subprocess.Popen(“cat abc.txt”, shell=True)
    위의 두 번째는 사실:subprocess에 해당한다.Popen(["/bin/bash", “-c”, “cat abc.txt”])
    예:
    
    [root@localhost python]# cat 3.py
    #!/bin/env python3
    import subprocess
    obj = subprocess.Popen("ls -l /ltp",
                           shell=True,
                           stdin=subprocess.PIPE,
                           stdout=subprocess.PIPE,
                           stderr=subprocess.PIPE,
                           universal_newlines=True)
    error_info = obj.stderr.read()
    out_info = obj.stdout.read()
    result = out_info + error_info
    print(result)
    
    [root@localhost python]# ./3.py
    total 184980
    -rw-r--r--. 1 root root     10865 May  8 16:21 123.txt
    -rw-r--r--. 1 root root       802 Apr 21 09:42 ab.sh
    drwxr-xr-x. 3 root root       101 Apr  1 18:34 auth
    -rw-r--r--. 1 root root   5242880 Mar 18 13:20 bigfile
    -rwxrwxrwx. 1 root root      1392 Feb  5 09:24 dingding.sh
    Popen 클래스 객체 방법
    이름
    기능
    poll()
    종료 여부 확인, 반환값 설정
    wait()
    종료 대기, 반환값 설정
    communicate()
    매개 변수는 표준 입력입니다. 표준 출력과 표준 오류를 되돌려줍니다.
    send_signal()
    발동 신호 (주로 linux에서 유용함)
    terminate()
    프로세스를 종료하고 유닉스에 대응하는 SIGTERM 신호, 윈도우즈에서api 함수TerminateProcess() 호출
    kill()
    프로세스 죽이기(unix 대응 SIGKILL 신호), 윈도우즈 아래 동일
    stdin
    stdout
    stderr
    매개변수에서 PIPE를 지정할 때 유용
    pid
    프로세스 id
    returncode
    프로세스 반환값
    추가 방법
    1、subeprocess.call(*args, *kwargs):call() 방법으로 Popen () 실행 프로그램을 호출하고 실행이 완료될 때까지 기다립니다
    2、subpeocess.check_call (*args, *kwargs): 위의call () 을 호출합니다. 반환 값이 0이 아니면 이상 반환합니다.
    3、subprocess.check_output(*args, *kwargs): Popen () 실행 프로그램을 호출하고 표준 출력으로 되돌려줍니다.

    2. os모듈을 보충하여 외부 명령을 실행한다


    1、os.시스템 () 방법


    예:
    
    [root@localhost python]# cat 4.py
    #!/bin/env python3
    import os
    #  ret 
    ret = os.system('ls -l /ltp |head -2')
    print("
    " if ret == 0 else "
    ")
    실행 결과
    [root@localhost python]# ./4.py
    total 184980
    -rw-r--r--. 1 root root     10865 May  8 16:21 123.txt
    실행 성공

    2、os.popen () 사용법


    subprocess.Popen()과 유사하여 쓰지 않겠습니다.
    보충:subprocess.run () 및subprocess.Popen () 의 실행 결과는 캐시에 기록되어 있으며, 실행이 끝난 후에 결과를 출력할 수 있으며, 실시간으로 터미널에서 출력되지 않습니다.그리고 os.시스템 () 은 터미널 인터페이스에 실시간으로 출력됩니다.
    이상은Python이 외부 명령을 실행하는subprocess의 상세한 내용입니다. 더 많은 Python이 외부 명령을 실행하는 것에 관한 자료는 저희 다른 관련 글을 주목해 주십시오!

    좋은 웹페이지 즐겨찾기