작업에 대한 진행률 표시기가 표시되는 명령 줄 프로그램 (svnadmin verify)에 대한 래퍼 스크립트를 작성하려고합니다. 이렇게하면 랩핑 된 프로그램의 출력 라인이 출력되는 즉시 볼 수 있어야합니다.
나는을 사용하여 프로그램을 실행하고 사용 subprocess.Popen
하고 stdout=PIPE
각 줄을 읽은 다음 그에 따라 행동한다고 생각했다. 그러나 다음 코드를 실행하면 출력이 어딘가에 버퍼링되어 1 ~ 332 줄, 333 ~ 439 (마지막 출력 줄)의 두 덩어리로 나타납니다.
from subprocess import Popen, PIPE, STDOUT
p = Popen('svnadmin verify /var/svn/repos/config', stdout = PIPE,
stderr = STDOUT, shell = True)
for line in p.stdout:
print line.replace('\n', '')
하위 프로세스에 대한 문서를 약간 살펴본 후 bufsize
매개 변수를로 찾았 Popen
으므로 bufsize를 1 (각 행 버퍼) 및 0 (버퍼 없음)으로 설정하려고 시도했지만 값이 행 전달 방식을 변경하지 않는 것 같습니다.
이 시점에서 나는 빨대를 파악하기 시작했으며 다음과 같은 출력 루프를 작성했습니다.
while True:
try:
print p.stdout.next().replace('\n', '')
except StopIteration:
break
그러나 같은 결과를 얻었습니다.
하위 프로세스를 사용하여 실행 된 프로그램의 '실시간'프로그램 출력을 얻을 수 있습니까? 파이썬에서 순방향 호환 (아닌 exec*
) 다른 옵션이 있습니까?
sydout=PIPE
부모 프로세스를 무시하고 하위 프로세스가 콘솔에 직접 쓰도록 서브 생략을 시도 했습니까 ?