>  기사  >  백엔드 개발  >  Python의 하위 프로세스 모듈 수준 메서드 소개(코드 포함)

Python의 하위 프로세스 모듈 수준 메서드 소개(코드 포함)

不言
不言앞으로
2019-03-27 09:48:033089검색

이 기사는 Python의 하위 프로세스 모듈 수준 방법(코드 포함)을 소개합니다. 이는 특정 참조 가치가 있으므로 도움이 될 수 있습니다.

subprocess.run()

실행하고 args 매개변수로 지정된 명령이 완료될 때까지 기다린 후 CompletedProcess 인스턴스를 반환합니다.

매개변수: (*popenargs, input=None, Capture_output=False, timeout=None, check=False, **kwargs). input, Capture_output, timeout, check를 제외한 다른 매개변수는 Popen 생성자 매개변수와 일치합니다.

capture_output: True로 설정하면 stdout 및 stderr을 파이프로 리디렉션하고 더 이상 stderr 또는 stdout 매개변수를 전달할 수 없으며 그렇지 않으면 예외가 발생합니다.

input: 입력 매개변수는 하위 프로세스의 표준 입력으로 Popen.communicate() 메서드에 전달되며 문자열(인코딩 또는 오류 매개변수를 지정해야 하거나 텍스트를 True로 설정해야 함) 또는 바이트여야 합니다. 유형. None이 아닌 입력 매개변수는 stdin 매개변수와 함께 사용할 수 없습니다. 그렇지 않으면 예외가 발생하고 Popen 인스턴스를 구성하는 데 사용되는 stdin 매개변수는 subprocess.PIPE로 지정됩니다.

timeout: Popen.communicate() 메서드에 전달됩니다.

check: True로 설정하면 프로세스 실행이 0이 아닌 상태 코드를 반환하는 경우 CalledProcessError 예외가 발생합니다.

# 源码

def run(*popenargs, input=None, capture_output=False, timeout=None, check=False, **kwargs):
    if input is not None:
        if 'stdin' in kwargs:
            raise ValueError('stdin and input arguments may not both be used.')
        kwargs['stdin'] = PIPE
    
    if capture_output:
        if ('stdout' in kwargs) or ('stderr' in kwargs):
            raise ValueError('stdout and stderr arguments may not be used '
                             'with capture_output.')
        kwargs['stdout'] = PIPE
        kwargs['stderr'] = PIPE
    
    with Popen(*popenargs, **kwargs) as process:
        try:
            stdout, stderr = process.communicate(input, timeout=timeout)
        except TimeoutExpired:
            process.kill()
            stdout, stderr = process.communicate()
            raise TimeoutExpired(process.args, timeout, output=stdout,
                                 stderr=stderr)
        except:  # Including KeyboardInterrupt, communicate handled that.
            process.kill()
            # We don't call process.wait() as .__exit__ does that for us.
            raise
        retcode = process.poll()
        if check and retcode:
            raise CalledProcessError(retcode, process.args,
                                     output=stdout, stderr=stderr)
    return CompletedProcess(process.args, retcode, stdout, stderr)

python3.5 이전에는 call(), check_all() 및 checkoutput() 세 가지 메서드가 하위 프로세스 모듈의 고급 API를 구성했습니다.

subprocess.call()

args 매개변수로 지정된 명령이 완료될 때까지 실행하고 대기한 후 실행 상태 코드(Popen 인스턴스의 returncode 속성)를 반환합니다.

매개변수: (*popenargs, timeout=None, **kwargs). 기본적으로 Popen 생성자 매개변수와 동일하며, timeout을 제외한 모든 매개변수는 Popen 인터페이스에 전달됩니다.

call() 함수를 호출할 때 stdout=PIPE 또는 stderr=PIPE를 사용하지 마세요. 왜냐하면 자식 프로세스가 OS 파이프 버퍼를 채우기에 충분한 출력을 파이프에 생성하면 자식 프로세스가 파이프에서 데이터를 읽을 수 없기 때문에 차단되기 때문입니다. 파이프.

# 源码

def call(*popenargs, timeout=None, **kwargs):
    with Popen(*popenargs, **kwargs) as p:
        try:
            return p.wait(timeout=timeout)
        except:
            p.kill()
            p.wait()
            raise

subprocess.check_call()

실행하고 args 매개변수로 지정된 명령이 완료될 때까지 기다리거나, 0 상태 코드를 반환하거나 CalledProcessError 예외를 발생시킵니다. 예외의 cmd 및 returncode 속성은 명령 및 상태 코드를 볼 수 있습니다. 예외를 실행한 것입니다.

매개변수: (*popenargs, **kwargs). 모든 매개변수는 call() 함수에 전달됩니다.

참고사항은 call()

# 源码

def check_call(*popenargs, **kwargs):
    retcode = call(*popenargs, **kwargs)
    if retcode:
        cmd = kwargs.get("args")
        if cmd is None:
            cmd = popenargs[0]
        raise CalledProcessError(retcode, cmd)
    return 0

subprocess.check_output()

과 동일합니다. args 매개변수로 지정된 명령이 완료될 때까지 실행하고 대기한 후 표준 출력(CompletedProcess 인스턴스의 stdout 속성)을 반환합니다. 유형은 바이트 바이트이며, 바이트 인코딩이 가능합니다. 실행된 명령어에 따라 universal_newlines=True로 설정하면 문자열 유형의 값을 반환할 수 있습니다.
실행 상태 코드가 0이 아닌 경우 CalledProcessError 예외가 발생합니다.

매개변수: (*popenargs, timeout=None, **kwargs). 모든 인수는 run() 함수에 전달되지만 상위 프로세스의 표준 입력 파일 핸들을 상속하기 위해 명시적으로 input=None을 전달하는 것은 지원되지 않습니다.

반환 값에서 표준 오류를 캡처하려면 stderr=subprocess.STDOUT을 설정하세요. 표준 오류를 CalledProcessError 예외의 stderr 속성을 통해 액세스되는 stderr=subprocess.PIPE 파이프로 리디렉션할 수도 있습니다.

# 源码

def check_output(*popenargs, timeout=None, **kwargs):
    if 'stdout' in kwargs:
        raise ValueError('stdout argument not allowed, it will be overridden.')

    if 'input' in kwargs and kwargs['input'] is None:
        # Explicitly passing input=None was previously equivalent to passing an
        # empty string. That is maintained here for backwards compatibility.
        kwargs['input'] = '' if kwargs.get('universal_newlines', False) else b''

    return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
               **kwargs).stdout

subprocess 모듈은 python2.x 버전의 Commands 모듈과 관련된 기능도 제공합니다.

subprocess.getstatusoutput(cmd)

실제로 check_output() 함수를 호출하고, 셸에서 문자열 유형 cmd 명령어를 실행하고, 출력(stderr 및 stdout 포함) 형식으로 튜플을 반환합니다. 후행 줄 바꿈이 제거된 로케일 인코딩 디코딩된 문자열입니다.

# 源码

try:
    data = check_output(cmd, shell=True, universal_newlines=True, stderr=STDOUT)
    exitcode = 0
except CalledProcessError as ex:
    data = ex.output
    exitcode = ex.returncode
if data[-1:] == '\n':
    data = data[:-1]
return exitcode, data

subprocess.getoutput(cmd)

getstatusoutput()과 유사하지만 결과는 출력만 반환합니다.

이 기사는 여기서 끝났습니다. 더 많은 흥미로운 콘텐츠를 보려면 PHP 중국어 웹사이트의 python 비디오 튜토리얼 칼럼을 주목하세요!

위 내용은 Python의 하위 프로세스 모듈 수준 메서드 소개(코드 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제