Dimulai dengan Python 2.6 Anda dapat menggunakan apa pun yang mengimplementasikan TextIOBase
API dari modul io sebagai penggantinya. Solusi ini juga memungkinkan Anda menggunakan sys.stdout.buffer.write()
Python 3 untuk menulis (sudah) string byte yang dikodekan ke stdout (lihat stdout di Python 3 ). Menggunakan StringIO
tidak akan berhasil saat itu, karena tidak sys.stdout.encoding
jugasys.stdout.buffer
akan tersedia.
Solusi menggunakan TextIOWrapper:
import sys
from io import TextIOWrapper, BytesIO
old_stdout = sys.stdout
sys.stdout = TextIOWrapper(BytesIO(), sys.stdout.encoding)
sys.stdout.seek(0)
out = sys.stdout.read()
sys.stdout.close()
sys.stdout = old_stdout
Solusi ini berfungsi untuk Python 2> = 2.6 dan Python 3.
Harap dicatat bahwa baru kami sys.stdout.write()
hanya menerima string unicode dan sys.stdout.buffer.write()
hanya menerima string byte. Ini mungkin bukan kasus untuk kode lama, tetapi sering kali kasus kode yang dibuat untuk berjalan di Python 2 dan 3 tanpa perubahan, yang lagi-lagi sering menggunakansys.stdout.buffer
.
Anda dapat membuat sedikit variasi yang menerima string unicode dan byte untuk write()
:
class StdoutBuffer(TextIOWrapper):
def write(self, string):
try:
return super(StdoutBuffer, self).write(string)
except TypeError:
return super(StdoutBuffer, self).buffer.write(string)
Anda tidak perlu menyetel pengkodean buffer sys.stdout.encoding, tetapi ini membantu saat menggunakan metode ini untuk menguji / membandingkan keluaran skrip.
stdout = open("file", "a")
dengan sendirinya akan mengarahkan apapun.