나는 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] 삭제
몇 마디 만하겠습니다