เริ่มต้นด้วย Python 2.6 คุณสามารถใช้อะไรก็ได้ที่ใช้TextIOBase
APIจากโมดูล io แทน โซลูชันนี้ยังช่วยให้คุณสามารถใช้sys.stdout.buffer.write()
ใน Python 3 เพื่อเขียนสตริงไบต์ที่เข้ารหัส (แล้ว) เป็น stdout (ดูstdout ใน Python 3 ) การใช้StringIO
จะไม่ทำงานแล้วเพราะค่าsys.stdout.encoding
มิได้sys.stdout.buffer
จะใช้ได้
วิธีแก้ปัญหาโดยใช้ 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
วิธีนี้ใช้ได้กับ Python 2> = 2.6 และ Python 3
โปรดทราบว่าใหม่ของเราsys.stdout.write()
ยอมรับเฉพาะสตริง Unicode และsys.stdout.buffer.write()
ยอมรับเฉพาะสตริงไบต์เท่านั้น นี่อาจไม่ใช่กรณีของรหัสเก่า แต่มักเป็นกรณีของรหัสที่สร้างขึ้นเพื่อทำงานบน Python 2 และ 3 โดยไม่มีการเปลี่ยนแปลงซึ่งมักจะใช้ประโยชน์จากสิ่งsys.stdout.buffer
นี้อีกครั้ง
คุณสามารถสร้างรูปแบบเล็กน้อยที่ยอมรับสตริงยูนิโค้ดและไบต์สำหรับwrite()
:
class StdoutBuffer(TextIOWrapper):
def write(self, string):
try:
return super(StdoutBuffer, self).write(string)
except TypeError:
return super(StdoutBuffer, self).buffer.write(string)
คุณไม่จำเป็นต้องตั้งค่าการเข้ารหัสของบัฟเฟอร์ sys.stdout.encoding แต่จะช่วยได้เมื่อใช้วิธีนี้ในการทดสอบ / เปรียบเทียบเอาต์พุตสคริปต์
stdout = open("file", "a")
ตัวเองจะเปลี่ยนเส้นทางอะไร