Bắt đầu với Python 2.6, bạn có thể sử dụng bất cứ điều gì thực hiện TextIOBase
API từ các module io như một sự thay thế. Giải pháp này cũng cho phép bạn sử dụng sys.stdout.buffer.write()
trong Python 3 để viết các chuỗi byte được mã hóa (đã) thành stdout (xem stdout in Python 3). Sử dụng StringIO
sẽ không hoạt động sau đó, vì không phải sys.stdout.encoding
cũng không phải sys.stdout.buffer
sẽ khả dụng.
Một giải pháp sử dụng TextIOWrapper:
import sys
from io import TextIOWrapper, BytesIO
# setup the environment
old_stdout = sys.stdout
sys.stdout = TextIOWrapper(BytesIO(), sys.stdout.encoding)
# do something that writes to stdout or stdout.buffer
# get output
sys.stdout.seek(0) # jump to the start
out = sys.stdout.read() # read output
# restore stdout
sys.stdout.close()
sys.stdout = old_stdout
Giải pháp này làm việc cho Python 2> = 2.6 và Python 3.
Xin lưu ý rằng mới sys.stdout.write()
chỉ chấp nhận chuỗi unicode của chúng tôi và sys.stdout.buffer.write()
chỉ chấp nhận chuỗi byte. Đây có thể không phải là trường hợp cho mã cũ, nhưng thường là trường hợp mã được xây dựng để chạy trên Python 2 và 3 mà không có thay đổi, điều này thường sử dụng sys.stdout.buffer
.
Bạn có thể xây dựng sự thay đổi nhỏ chấp nhận unicode và byte chuỗi cho write()
:
class StdoutBuffer(TextIOWrapper):
def write(self, string):
try:
return super(StdoutBuffer, self).write(string)
except TypeError:
# redirect encoded byte strings directly to buffer
return super(StdoutBuffer, self).buffer.write(string)
Bạn không cần phải thiết lập mã hóa của đệm sys.stdout.encoding, nhưng điều này sẽ giúp khi sử dụng phương pháp này để kiểm tra/so sánh đầu ra tập lệnh.
Tôi không nghĩ rằng 'stdout = o bút ("tập tin", "a") 'của chính nó sẽ chuyển hướng bất cứ điều gì. – Alexey