하위 프로세스 및 Popen을 사용하여 장기 실행 프로세스에서 stdout을 반환하는 방법은 무엇입니까?

평온

나는 subprocess.Popen ()과 함께 꽤 기본적인 설정을 사용하고 있으며 나중에 파이썬 스크립트의 다른 부분으로 돌아가는 변수에 stdout을 지시하고 있습니다.

내 기본 Popen 코드는 다음과 같습니다.

process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# wait for the process to terminate
out, err = process.communicate()
errcode = process.returncode
print out

이것은 ls -al유사하거나 유사한 많은 기본 사용 사례에 적합 합니다. 그러나 .NET과 같은 더 오래 (또는 무기한) 실행되는 프로세스에서 정기적으로 일관되게 출력을 얻는 방법을 궁금합니다 tail -f foo.log. 루프에서 주기적으로 stdout을 읽는 방법이 있습니까? 아니면 스레드를 생성하여 주기적으로 확인하고 반환합니까? 여기서 가장 좋은 접근 방법은 무엇입니까?

감사!

시로 센

원래 코드가 정확하지 않거나 안전하지 않다는 점에 유의하는 것이 중요하다고 생각합니다. 일반적으로 작동하지만 주어진 예제에서는 프로세스가 종료 될 때까지 기다리지 않습니다. 아직 실행 중일 수 있습니다.

process.poll()그리고 process.wait()이 목적을 위해 두 가지 좋은 옵션이 있습니다.


출력의 크기를 모르는 경우 communicate출력을 메모리로 버퍼링하고 메모리가 부족할 수 있으므로 위험합니다. 그러나을 사용하는 경우 subprocess.PIPE어쨌든 이런 일이 발생할 수 있습니다 .

당신은주의 깊게에 대한 목표를 선택해야 stdout하고 stderr필요에 따라. 매우 클 수있는 경우 디스크의 파일에 쓰는 것이 가장 좋은 방법 일 수 있습니다. 그러나 그것은 별도의 논의입니다.


프로세스가 닫힐 때까지 기다리지 않고 출력을 보려면 별도의 스레드에서 다음과 같이 실행해야합니다.

while process.returncode is None:
    # handle output by direct access to stdout and stderr
    for line in process.stdout:
        print line
    # set returncode if the process has exited
    process.poll()

파일 객체 stdout및에 실제로 액세스하는 방법에 대한 의견이 열려 stderr있습니다.

이것이 생성 된 하위 프로세스를 처리하는 가장 강력한 방법이지만 가능한 process.wait()경우 사용 하는 것에 대해 신중하게 생각하십시오 . 모든 것이 훨씬 간단 해집니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관