2009-05-19 24 views

Trả lời

41

Điều tốt nhất tôi có thể đưa ra:

>>> import os 
>>> import sys 
>>> unbuffered = os.fdopen(sys.stdout.fileno(), 'w', 0) 
>>> unbuffered.write('test') 
test>>> 
>>> sys.stdout = unbuffered 
>>> print 'test' 
test 

Thử nghiệm trên GNU/Linux. Có vẻ như nó cũng hoạt động trên Windows. Nếu tôi biết làm thế nào để mở lại sys.stdout, nó sẽ dễ dàng hơn nhiều:

sys.stdout = open('???', 'w', 0) 

Tài liệu tham khảo:
http://docs.python.org/library/stdtypes.html#file-objects
http://docs.python.org/library/functions.html#open
http://docs.python.org/library/os.html#file-object-creation

[Chỉnh sửa]

Lưu ý rằng nó sẽ là có lẽ tốt hơn để đóng sys.stdout trước khi ghi đè lên nó.

+0

làm việc như một say mê! –

+1

'stdout' vẫn tồn tại trong' sys .__ stdout__' –

+5

Lưu ý rằng điều này không hoạt động trong Py3K. 'ValueError: không thể có văn bản unbuffered I/O' – vbo

4

Giả sử bạn đang ở trên Windows:

msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) 
+0

xin lỗi, quên thêm rằng. trên linux (ubuntu) –

+4

@Martin DeMello: Vui lòng không thêm thông tin mới vào nhận xét. Vui lòng cập nhật câu hỏi của bạn với các sự kiện mới. Không thể tìm thấy sự thật mới trong nhận xét. –

+0

đã hoàn tất. xin lỗi vì điều đó. –

6

Bạn có thể sử dụng thực tế là stderr không bao giờ được đệm và cố gắng chuyển hướng stdout để stderr:

import sys 
#buffered output is here 
doStuff() 

oldStdout = sys.stdout 
sys.stdout = sys.stderr 
#unbuffered output from here on 

doMoreStuff() 
sys.stdout = oldStdout 

#the output is buffered again 
doEvenMoreStuff() 
+3

một hack, nhưng một cái rất dễ thương :) không thực sự hoạt động nếu bạn cần stderr riêng biệt nhưng ý tưởng tốt đẹp của bạn –

+0

cảm ơn. như để tách: bạn không thể có được tất cả, bạn có thể :) –

19

Bạn luôn có thể vượt qua các tham số -u trong dòng công việc:

#!/usr/bin/python -u 
+13

Xem tiêu đề: 1. OP biết về nó; 2. muốn làm điều đó theo chương trình. – Tobu

+11

Tác giả ngụ ý việc sử dụng dòng lệnh, không biểu thị sự quen thuộc với lời gọi thay thế do trình bao (shebang) cung cấp. Cảm ơn phản hồi hữu ích của bạn. – mikewaters

+6

Điều này dường như không hoạt động với "mẹo env". '#!/usr/bin/env python -u'. Tôi nhận được lỗi sau đây '/ usr/bin/env: python -u: Không có tập tin hoặc thư mục'. Nếu tôi xóa '-u' nó hoạt động lại. –

Các vấn đề liên quan