차단 및 비 차단 하위 프로세스 호출
나는 완전히 사이에 혼동하고있어 subprocess.call()
, subprocess.Popen()
, subprocess.check_call()
.
차단하고 있지 않은 것은 무엇입니까?
내가 말하는 것은 subprocess.Popen()
부모 프로세스 가 실행을 계속하기 전에 자식 프로세스를 return
/ 기다릴 지 여부를 사용 하는지 여부 exit
입니다.
어떻게 shell=True
이러한 호출에 영향을 줍니까?
Popen
차단되지 않습니다. 차단 call
하고 check_call
있습니다. 또는 메서드 Popen
를 호출 하여 인스턴스 블록을 만들 수 있습니다 .wait
communicate
소스 코드 를 살펴보면 call
호출 이 표시 Popen(...).wait()
되므로 차단됩니다. check_call
를 호출 call
하므로 차단됩니다.
엄밀히 말하면 shell=True
차단 문제와 직교합니다. 그러나 shell=True
Python이 셸을 실행 한 다음 셸에서 명령을 실행하도록합니다. 차단 호출을 사용하는 경우 셸 이 완료 되면 호출이 반환됩니다 . 셸은 명령을 실행하기 위해 하위 프로세스를 생성 할 수 있으므로 생성 된 하위 프로세스 전에 셸이 완료 될 수 있습니다. 예를 들면
import subprocess
import time
proc = subprocess.Popen('ls -lRa /', shell=True)
time.sleep(3)
proc.terminate()
proc.wait()
여기에 두 개의 프로세스가 생성됩니다. Popen은 쉘을 실행하는 하나의 하위 프로세스를 생성합니다. 차례로 쉘은를 실행하는 하위 프로세스를 생성합니다 ls
. proc.terminate()
쉘을 죽이지 만 실행중인 하위 프로세스 ls
는 남아 있습니다. (이것은 파이썬 스크립트가 끝난 후에도 방대한 출력으로 나타납니다. ls
with 를 죽일 준비를하십시오 pkill ls
.)
참고 URL : https://stackoverflow.com/questions/21936597/blocking-and-non-blocking-subprocess-calls
'IT Share you' 카테고리의 다른 글
Cygwin ls 명령을 찾을 수 없습니다. (0) | 2020.12.08 |
---|---|
경로 값을 포함한 URL.Action () (0) | 2020.12.08 |
Phoenix Framework에서`def`와`defp`의 차이점은 무엇입니까? (0) | 2020.12.08 |
현재 디렉토리를 bash 기록에 저장 (0) | 2020.12.08 |
.NET / C #에서 다른 프로세스의 명령 줄 인수를 가져올 수 있습니까? (0) | 2020.12.08 |