IT Share you

차단 및 비 차단 하위 프로세스 호출

shareyou 2020. 12. 8. 20:26
반응형

차단 및 비 차단 하위 프로세스 호출


나는 완전히 사이에 혼동하고있어 subprocess.call(), subprocess.Popen(), subprocess.check_call().

차단하고 있지 않은 것은 무엇입니까?

내가 말하는 것은 subprocess.Popen()부모 프로세스 가 실행을 계속하기 전에 자식 프로세스를 return/ 기다릴 지 여부를 사용 하는지 여부 exit입니다.

어떻게 shell=True이러한 호출에 영향을 줍니까?


Popen차단되지 않습니다. 차단 call하고 check_call있습니다. 또는 메서드 Popen를 호출 하여 인스턴스 블록을 만들 수 있습니다 .waitcommunicate

소스 코드 를 살펴보면 call호출 이 표시 Popen(...).wait()되므로 차단됩니다. check_call를 호출 call하므로 차단됩니다.

엄밀히 말하면 shell=True차단 문제와 직교합니다. 그러나 shell=TruePython이 셸을 실행 한 다음 셸에서 명령을 실행하도록합니다. 차단 호출을 사용하는 경우 이 완료 되면 호출이 반환됩니다 . 셸은 명령을 실행하기 위해 하위 프로세스를 생성 할 수 있으므로 생성 된 하위 프로세스 전에 셸이 완료 될 수 있습니다. 예를 들면

import subprocess
import time

proc = subprocess.Popen('ls -lRa /', shell=True)
time.sleep(3)
proc.terminate()
proc.wait()

여기에 두 개의 프로세스가 생성됩니다. Popen은 쉘을 실행하는 하나의 하위 프로세스를 생성합니다. 차례로 쉘은를 실행하는 하위 프로세스를 생성합니다 ls. proc.terminate()쉘을 죽이지 만 실행중인 하위 프로세스 ls는 남아 있습니다. (이것은 파이썬 스크립트가 끝난 후에도 방대한 출력으로 나타납니다. lswith 를 죽일 준비를하십시오 pkill ls.)

참고 URL : https://stackoverflow.com/questions/21936597/blocking-and-non-blocking-subprocess-calls

반응형