Câu trả lời của Taymon giải quyết trực tiếp câu hỏi của bạn trong stdin/stdout của IDLE thực sự là các đối tượng giống như tệp và không phải luồng tệp chuẩn được kết hợp với bảng điều khiển/thiết bị đầu cuối. Hơn nữa, trong Windows IDLE chạy với pythonw.exe, mà thậm chí không có một giao diện điều khiển win32 kèm theo.
Điều đó nói rằng, nếu bạn chỉ cần đầu ra từ một chương trình được in cho người dùng trong thời gian thực, thì trong nhiều trường hợp (nhưng không phải tất cả) bạn có thể đọc dòng đầu ra theo dòng và lặp lại nó cho phù hợp. Các công trình sau đây cho tôi trong Windows IDLE. Nó thể hiện việc đọc từ một đường ống stdout
theo đường thẳng. Nó cũng cho thấy những gì sẽ xảy ra nếu quá trình đệm đường ống, trong trường hợp này readline
sẽ chặn cho đến khi bộ đệm đầy hoặc đường ống đóng. Việc đệm này có thể bị vô hiệu hóa bằng tay với một số chương trình (như tùy chọn -u của trình thông dịch Python), và có các cách giải quyết cho Unix như 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)
Sản lượng trong IDLE nên những điều sau đây, với tập đầu tiên của chữ số được in cùng một lúc sau khi một sự chậm trễ và thứ hai thiết lập dòng in theo dòng.
Testing buffered subprocess...
0
1
2
3
4
Testing unbuffered subprocess...
0
1
2
3
4
Trên Windows IDLE chạy qua pythonw.exe, vì vậy nó không có bảng điều khiển 'stdin',' stdout' và 'stderr'. – eryksun
nhưng có một cách để lừa python vào làm việc đó không? – dmjalund