복붙노트

[PYTHON] 서브 프로세스가 실행되는 동안 stdout 인터셉트

PYTHON

서브 프로세스가 실행되는 동안 stdout 인터셉트

이것이 내 하위 프로세스 인 경우 :

import time, sys
for i in range(200):
    sys.stdout.write( 'reading %i\n'%i )
    time.sleep(.02)

그리고 이것은 하위 프로세스의 출력을 제어하고 수정하는 스크립트입니다.

import subprocess, time, sys

print 'starting'

proc = subprocess.Popen(
    'c:/test_apps/testcr.py',
    shell=True,
    stdin=subprocess.PIPE,
    stdout=subprocess.PIPE  )

print 'process created'

while True:
    #next_line = proc.communicate()[0]
    next_line = proc.stdout.readline()
    if next_line == '' and proc.poll() != None:
        break
    sys.stdout.write(next_line)
    sys.stdout.flush()

print 'done'

프로세스가 완료 될 때까지 readline 및 통신 대기가 발생하는 이유는 무엇입니까? 하위 프로세스의 표준 출력을 실시간으로 전달 (및 수정)하는 간단한 방법이 있습니까?

BTW, 이걸 봤지만 로깅 기능이 필요하지 않습니다. (많은 부분을 이해할 필요가 없습니다.)

Windows XP입니다.

해결법

  1. ==============================

    1.Charles가 이미 언급했듯이 문제는 완충 작용을합니다. 나는 SNMPd를위한 모듈을 작성할 때 비슷한 문제를 일으켰다. stdout을 자동 플러시 버전으로 바꾸어 해결했다.

    Charles가 이미 언급했듯이 문제는 완충 작용을합니다. 나는 SNMPd를위한 모듈을 작성할 때 비슷한 문제를 일으켰다. stdout을 자동 플러시 버전으로 바꾸어 해결했다.

    내가 ActiveState에 대한 몇 가지 게시물에서 영감을 다음 코드를 사용 :

    class FlushFile(object):
        """Write-only flushing wrapper for file-type objects."""
        def __init__(self, f):
            self.f = f
        def write(self, x):
            self.f.write(x)
            self.f.flush()
    
    # Replace stdout with an automatically flushing version
    sys.stdout = FlushFile(sys.__stdout__)
    
  2. ==============================

    2.프로세스 출력이 버퍼링됩니다. 더 유닉스적인 운영체제 (또는 Cygwin)에서는 버퍼링 관련 문제를 피하기 위해 필요한 모든 주문을 암시하는 pexpect 모듈을 사용할 수있다. 그러나 이러한 주문에는 작동하지 않는 pty 모듈이 필요합니다.이 모듈은 원시 (비 cygwin) win32 Python 빌드에서는 사용할 수 없습니다.

    프로세스 출력이 버퍼링됩니다. 더 유닉스적인 운영체제 (또는 Cygwin)에서는 버퍼링 관련 문제를 피하기 위해 필요한 모든 주문을 암시하는 pexpect 모듈을 사용할 수있다. 그러나 이러한 주문에는 작동하지 않는 pty 모듈이 필요합니다.이 모듈은 원시 (비 cygwin) win32 Python 빌드에서는 사용할 수 없습니다.

    하위 프로세스를 제어하는 ​​예제의 경우 필요한 경우 sys.stdout.flush ()를 호출 할 수 있습니다. 그러나 임의의 하위 프로세스의 경우 해당 옵션을 사용할 수 없습니다.

    "파이프 (popen ())를 사용하지 않는 이유는 무엇입니까?" pexpect FAQ에서.

  3. from https://stackoverflow.com/questions/527197/intercepting-stdout-of-a-subprocess-while-it-is-running by cc-by-sa and MIT license