>백엔드 개발 >파이썬 튜토리얼 >Python 표준 라이브러리의 하위 프로세스 패키지에 대한 자세한 소개

Python 표준 라이브러리의 하위 프로세스 패키지에 대한 자세한 소개

高洛峰
高洛峰원래의
2017-03-23 16:51:122311검색

여기에 있는 콘텐츠는 Linux 프로세스 기본 사항과 Linux 텍스트 스트림을 기반으로 합니다. 하위 프로세스 패키지의 주요 기능은 외부 명령과 프로그램을 실행하는 것입니다. 예를 들어, 파일을 다운로드하려면 wget을 사용해야 합니다. Python에서 wget 프로그램을 호출합니다. 이러한 의미에서 하위 프로세스는 셸과 유사하게 작동합니다.

하위 프로세스와 일반적으로 사용되는 캡슐화 기능

파이썬을 실행하면 프로세스를 생성하고 실행하게 됩니다. Linux 프로세스 기본에서 소개한 것처럼 프로세스는 하위 프로세스를 분기하고 하위 프로세스가 다른 프로그램을 실행하도록 할 수 있습니다. Python에서는 표준 라이브러리의 하위 프로세스 패키지를 사용하여 하위 프로세스를 분기하고 외부 프로그램을 실행합니다(포크 및 실행에 대한 Linux 프로세스 기본 사항 참조).

subprocess 패키지는 하위 프로세스를 생성하기 위한 여러 기능을 정의합니다. 이러한 함수는 다양한 방식으로 하위 프로세스를 생성하므로 필요에 따라 그 중 하나를 선택할 수 있습니다. 또한 하위 프로세스는 프로세스 간 텍스트 통신을 사용하기 위해 표준 스트림 및 파이프를 관리하는 몇 가지 도구도 제공합니다.

하위 프로세스 패키지의 함수를 사용하여 하위 프로세스를 생성하는 경우 다음 사항에 유의하세요.

1) 하위 프로세스를 생성한 후 상위 프로세스가 일시 중지되고 하위 프로세스가 실행될 때까지 대기하는지 여부 달리다.

2) 함수는 무엇을 반환하나요?

3) 반환 코드가 0이 아닌 경우 상위 프로세스는 이를 어떻게 처리합니까?

subprocess.call()



상위 프로세스는 하위 프로세스가 완료될 때까지 기다립니다.

종료 정보 반환(반환 코드, 종료 코드와 동일, Linux 프로세스 기본 사항 참조)

subprocess.check_call()


상위 프로세스는 하위 프로세스가 완료될 때까지 기다립니다

0을 반환

종료 정보를 확인하여 반환 코드가 0이 아니면 오류를 발생시킵니다. subprocess.CalledProcessError. 이 개체에는 반환 코드가 포함되어 있습니다. 속성은 try...excess...로 확인할 수 있습니다(Python 오류 처리 참조).

subprocess.check_output()



상위 프로세스는 하위 프로세스가 완료될 때까지 기다립니다

하위 프로세스의 출력 결과를 표준 출력으로 반환

확인 returncode가 0이 아닌 경우 종료 정보, subprocess.CalledProcessError 오류가 발생합니다. 이 객체에는 returncode 속성과 출력 속성이 포함되어 있으며, 출력 속성은 표준 출력의 출력 결과이며 try로 확인할 수 있습니다. ...제외하고....

이 세 가지 함수의 사용법은 비슷합니다. 설명을 위해 subprocess.call()을 사용합니다.

import subprocess
rc = subprocess.call(["ls","-l"])



이름(ls)과 매개변수(-l)는 테이블에 함께 배치되어 subprocess.call()

에 전달됩니다. 전체 문자열은 셸을 통해 해석될 수 있습니다.

import subprocess
out = subprocess.call("ls -l", shell=True)
out = subprocess.call("cd ..", shell=True)



우리는 shell=True 매개변수를 사용했습니다. 이번에는 테이블 대신 전체 문자열을 사용하여 하위 프로세스를 실행합니다. Python은 먼저 쉘을 실행한 다음 이 쉘을 사용하여 전체 문자열을 해석합니다.

셸 명령 중 일부는 셸에 내장된 명령입니다. 이러한 명령은 $cd 셸을 통해 실행되어야 합니다. shell=True를 사용하면 이러한 명령을 실행할 수 있습니다.

Popen()

사실 위 세 가지 함수는 모두 Popen()을 기반으로 한 래퍼입니다. 이러한 캡슐화의 목적은 하위 프로세스를 더 쉽게 사용할 수 있도록 하는 것입니다. 우리의 필요에 맞게 더 맞춤화하려면 하위 프로세스를 나타내는 개체를 생성하는 Popen 클래스를 사용합니다.

위의 캡슐화와 달리 Popen 객체가 생성된 후 메인 프로그램은 하위 프로세스가 완료될 때까지 자동으로 기다리지 않습니다. 상위 프로세스가 기다리도록(즉, 블록을 차단하려면) 객체의 wait() 메서드를 호출해야 합니다.

import subprocess
child = subprocess.Popen(["ping","-c","5","www.google.com"])
print("parent process")



실행에서 볼 수 있듯이 결과적으로 상위 프로세스는 하위 프로세스를 여는 중입니다. 프로세스는 하위 프로세스가 완료될 때까지 기다리지 않고 직접 인쇄를 실행합니다.

대기 상황 비교:

import subprocess
child = subprocess.Popen(["ping","-c","5","www.google.com"])
child.wait()
print("parent process")



또한 부모 프로세스의 자식 프로세스에 대해 다른 작업을 수행할 수도 있습니다. 위의 예 개체:

child.poll()      # 检查子进程状态

child.kill()      # 终止子进程

child.send_signal()  # 向子进程发送信号

child.terminate()   # 终止子进程


하위 프로세스의 PID는 child.pid에 저장됩니다

하위 프로세스의 텍스트 흐름 제어

(상속된 하위 하위 프로세스) 하위 프로세스의 표준 입력, 표준 출력 및 표준 오류는 다음 속성으로도 표현할 수 있습니다.

child.stdin

child .stdout

child.stderr

Popen()이 하위 프로세스를 생성할 때 표준 입력, 표준 출력 및 표준 오류를 변경할 수 있으며, subprocess.PIPE를 사용하여 하위 프로세스의 입력과 출력을 연결할 수 있습니다. 여러 하위 프로세스를 함께 사용하여 파이프를 형성합니다.

import subprocess
child1 = subprocess.Popen(["ls","-l"], stdout=subprocess.PIPE)
child2 = subprocess.Popen(["wc"], stdin=child1.stdout,stdout=subprocess.PIPE)
out = child2.communicate()
print(out)


subprocess.PIPE는 실제로 텍스트 스트림을 위한 버퍼 영역을 제공합니다. Child1의 stdout은 텍스트를 버퍼 영역에 출력하고, child2의 stdin은 PIPE에서 텍스트를 읽습니다. child2의 출력 텍스트는 communications() 메소드가 PIPE에서 PIPE의 텍스트를 읽을 때까지 PIPE에 저장됩니다.

communicate()는 자식 프로세스가 완료될 때까지 부모 프로세스를 차단하는 Popen 객체의 메서드라는 점에 유의해야 합니다.

또한 communications() 메소드를 사용하여 PIPE를 사용하여 하위 프로세스에 입력을 입력할 수도 있습니다.

import subprocess
child = subprocess.Popen(["cat"], stdin=subprocess.PIPE)
child.communicate("vamei")


我们启动子进程之后,cat会等待输入,直到我们用communicate()输入"vamei"。

通过使用subprocess包,我们可以运行外部程序。这极大的拓展了Python的功能。如果你已经了解了操作系统的某些应用,你可以从Python中直接调用该应用(而不是完全依赖Python),并将应用的结果输出给Python,并让Python继续处理。shell的功能(比如利用文本流连接各个应用),就可以在Python中实现。

总结

subprocess.call, subprocess.check_call(), subprocess.check_output()

subprocess.Popen(), subprocess.PIPE

Popen.wait(), Popen.communicate()


위 내용은 Python 표준 라이브러리의 하위 프로세스 패키지에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.