서브 프로세스 모듈은 2.6 및 3.1에 모두 같이 구현 편의 기능 call
갖파이썬의 subprocess.call이 왜 이렇게 구현 되었습니까?
def call(*popenargs, **kwargs):
return Popen(*popenargs, **kwargs).wait()
이 기능 설명서에 붉은 경고 전달을 읽고 :
경고 :
Popen.wait()
과 마찬가지로stdout=PIPE
및/또는stderr=PIPE
을 사용하면 교착 상태가되며 자식 프로세스는 파이프에 충분한 출력을 생성하여 OS 파이프 버퍼가 더 많은 데이터를 받아들이는 것을 차단합니다.
Popen.wait()
설명서에는 이러한 경우 대신 Popen.communicate()
이 사용됩니다. 음, 그렇다면 call
은 아래처럼 대신 구현되었으므로 어리석은 경고를 제거하고 표준 라이브러리에서 제거한 바보 같은 제한을 없앨 수 있습니까?
def call(*args, **kwargs):
input = kwargs.pop("input", None)
p = Popen(*args, **kwargs)
p.communicate(input)
return p.returncode
확실한 이유가 있습니다. 내가 뭘 놓치고 있니?
프로그램의 출력을 제어하는 것은 stdout = PIPE 및 stderr = PIPE를 사용하는 것입니다. 즉,'command>/dev/null 2> & 1'에 해당하는 python과 bash에서'$? '를 검사합니다. –
'stdout = open ('/ dev/null', 'w'), stderr = STDOUT'으로 더 잘하지 않겠습니까? –
@Baffe 추측하지만, 핵심은'call'의 stdout = 및 stderr = 키워드 인수를 사용해야하는 이유입니다. –