Taymon의 대답은 사용자의 질문을 직접적으로 해결합니다. IDLE의 stdin/stdout은 콘솔/터미널과 관련된 표준 파일 스트림이 아니라 실제로 파일과 유사한 객체입니다. 더욱이, Windows에서 IDLE은 pythonw.exe로 실행됩니다. pythonw.exe에는 첨부 된 win32 콘솔도 없습니다.
즉, 프로그램의 출력을 실시간으로 사용자에게 출력해야하는 경우 많은 경우 (전부는 아니지만) 한 줄씩 출력을 읽고 적절하게 에코 할 수 있습니다. 다음은 Windows IDLE에서 나를 위해 작동합니다. 그것은 라인별로 라인 stdout
을 읽는 것을 보여줍니다. 또한 프로세스가 파이프를 버퍼링하면 어떤 일이 일어나는지 보여줍니다.이 경우 버퍼가 꽉 찼거나 파이프가 닫힐 때까지 readline
이 차단됩니다. 이 버퍼링은 일부 프로그램 (예 : Python 인터프리터의 -u 옵션)을 사용하여 수동으로 비활성화 할 수 있으며 stdbuf과 같은 유닉스에 대한 해결 방법이 있습니다.
test1.py
import sys
import subprocess
def test(cmd):
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE,
stderr=subprocess.PIPE)
it = iter(p.stdout.readline, b'')
for line in it:
print(line.rstrip().decode('ascii'))
print('Testing buffered subprocess...')
test([sys.executable, 'test2.py'])
print('\nTesting unbuffered subprocess...')
#-u: unbuffered binary stdout and stderr
test([sys.executable, '-u', 'test2.py'])
test2.py :
import time
for i in range(5):
print(i)
time.sleep(1)
는 IDLE의 출력은 지연 제 후 한꺼번에 인쇄 숫자의 제 1 세트를 사용하여 다음되어야 줄 단위로 인쇄됩니다.
Testing buffered subprocess...
0
1
2
3
4
Testing unbuffered subprocess...
0
1
2
3
4
IDLE은 pythonw.exe를 통해 실행되므로 콘솔'stdin','stdout' 및'stderr' 파일 핸들조차도 사용하지 않습니다. – eryksun
하지만 파이썬을 속일 수있는 방법이 있습니까? – dmjalund