วิธีการล้างผลลัพธ์ของการพิมพ์ Python
ฉันแนะนำห้าวิธีในการทำสิ่งนี้:
- ใน Python 3 การโทร
print(..., flush=True)
(อาร์กิวเมนต์ flush ไม่มีในฟังก์ชั่นการพิมพ์ของ Python 2 และไม่มีคำสั่งอะนาล็อกสำหรับคำสั่งการพิมพ์)
- โทรหา
file.flush()
ไฟล์ที่ส่งออก (เราสามารถตัดฟังก์ชั่นการพิมพ์ของ python 2 เพื่อทำสิ่งนี้) ตัวอย่างเช่นsys.stdout
- ใช้สิ่งนี้กับการเรียกใช้ฟังก์ชั่นการพิมพ์ทุกครั้งในโมดูลที่มีฟังก์ชั่นบางส่วน
print = partial(print, flush=True)
นำไปใช้กับโมดูลทั่วโลก
- ใช้สิ่งนี้กับกระบวนการที่มีการตั้งค่าสถานะ (
-u
) ที่ส่งผ่านไปยังคำสั่งตัวแปล
- ใช้สิ่งนี้กับทุก ๆ ไพ ธ อนกระบวนการในสภาพแวดล้อมของคุณด้วย
PYTHONUNBUFFERED=TRUE
(และยกเลิกการตั้งค่าตัวแปรเพื่อยกเลิกสิ่งนี้)
Python 3.3+
การใช้ Python 3.3 หรือสูงกว่าคุณสามารถกำหนดflush=True
เป็นอาร์กิวเมนต์คำหลักให้กับprint
ฟังก์ชันได้:
print('foo', flush=True)
Python 2 (หรือ <3.3)
พวกเขาไม่ได้ส่งflush
อาร์กิวเมนต์กลับไปที่ Python 2.7 ดังนั้นหากคุณใช้ Python 2 (หรือน้อยกว่า 3.3) และต้องการรหัสที่เข้ากันได้กับทั้ง 2 และ 3 ฉันขอแนะนำรหัสความเข้ากันได้ต่อไปนี้ (โปรดทราบว่า__future__
การนำเข้าจะต้องอยู่ที่ / มาก "ใกล้กับด้านบนของโมดูล "):
from __future__ import print_function
import sys
if sys.version_info[:2] < (3, 3):
old_print = print
def print(*args, **kwargs):
flush = kwargs.pop('flush', False)
old_print(*args, **kwargs)
if flush:
file = kwargs.get('file', sys.stdout)
# Why might file=None? IDK, but it works for print(i, file=None)
file.flush() if file is not None else sys.stdout.flush()
รหัสการทำงานร่วมกันดังกล่าวจะครอบคลุมการใช้งานมากที่สุด แต่การรักษาอย่างละเอียดมากขึ้นดูsix
โมดูล
อีกทางหนึ่งคุณสามารถโทรหาfile.flush()
หลังจากพิมพ์ได้ด้วยคำสั่ง print ใน Python 2:
import sys
print 'delayed output'
sys.stdout.flush()
การเปลี่ยนค่าเริ่มต้นในหนึ่งโมดูลเป็น flush=True
คุณสามารถเปลี่ยนค่าเริ่มต้นสำหรับฟังก์ชั่นการพิมพ์โดยใช้ functools.partial ในขอบเขตส่วนกลางของโมดูล:
import functools
print = functools.partial(print, flush=True)
ถ้าคุณดูฟังก์ชันบางส่วนใหม่ของเราอย่างน้อยใน Python 3:
>>> print = functools.partial(print, flush=True)
>>> print
functools.partial(<built-in function print>, flush=True)
เราเห็นว่ามันใช้งานได้เหมือนปกติ:
>>> print('foo')
foo
และเราสามารถแทนที่ค่าเริ่มต้นใหม่ได้จริง:
>>> print('foo', flush=False)
foo
หมายเหตุอีกครั้งนี่เป็นการเปลี่ยนแปลงขอบเขตโกลบอลปัจจุบันเท่านั้นเนื่องจากชื่อการพิมพ์บนขอบเขตโกลบอลปัจจุบันจะมีผลต่อprint
ฟังก์ชันbuiltin (หรือไม่อ้างอิงฟังก์ชันความเข้ากันได้หากใช้หนึ่งใน Python 2 ในขอบเขตโกลบอลปัจจุบันนั้น)
หากคุณต้องการทำสิ่งนี้ภายในฟังก์ชั่นแทนที่จะอยู่ในขอบเขตทั่วโลกของโมดูลคุณควรให้ชื่อที่แตกต่างกันเช่น:
def foo():
printf = functools.partial(print, flush=True)
printf('print stuff like this')
หากคุณประกาศให้เป็นโกลบอลในฟังก์ชั่นคุณกำลังเปลี่ยนมันบนเนมสเปซส่วนกลางของโมดูลดังนั้นคุณควรใส่ไว้ในเนมสเปซส่วนกลางยกเว้นว่าพฤติกรรมเฉพาะนั้นเป็นสิ่งที่คุณต้องการ
การเปลี่ยนค่าเริ่มต้นสำหรับกระบวนการ
ฉันคิดว่าตัวเลือกที่ดีที่สุดที่นี่คือการใช้-u
แฟล็กเพื่อรับเอาต์พุตที่ไม่มีบัฟเฟอร์
$ python -u script.py
หรือ
$ python -um package.module
จากเอกสาร :
บังคับ stdin, stdout และ stderr ให้เต็มเปา บนระบบที่มีความสำคัญให้ใส่ stdin, stdout และ stderr ในโหมดไบนารี
โปรดทราบว่ามีการบัฟเฟอร์ภายในใน file.readlines () และ File Objects (สำหรับบรรทัดใน sys.stdin) ซึ่งไม่ได้รับอิทธิพลจากตัวเลือกนี้ ในการหลีกเลี่ยงปัญหานี้คุณจะต้องใช้ file.readline () ในขณะที่ 1: ลูป
การเปลี่ยนค่าเริ่มต้นสำหรับสภาพแวดล้อมการทำงานของเชลล์
คุณสามารถรับพฤติกรรมนี้สำหรับกระบวนการหลามทั้งหมดในสภาพแวดล้อมหรือสภาพแวดล้อมที่สืบทอดมาจากสภาพแวดล้อมหากคุณตั้งค่าตัวแปรสภาพแวดล้อมเป็นสตริงที่ไม่ว่างเปล่า:
เช่นใน Linux หรือ OSX:
$ export PYTHONUNBUFFERED=TRUE
หรือ Windows:
C:\SET PYTHONUNBUFFERED=TRUE
จากเอกสาร :
PYTHONUNBUFFERED
หากสิ่งนี้ถูกตั้งค่าเป็นสตริงที่ไม่ว่างจะเท่ากับการระบุอ็อพชัน -u
ภาคผนวก
นี่คือความช่วยเหลือในฟังก์ชั่นการพิมพ์จาก Python 2.7.12 - โปรดทราบว่าไม่มี flush
ข้อโต้แย้ง:
>>> from __future__ import print_function
>>> help(print)
print(...)
print(value, ..., sep=' ', end='\n', file=sys.stdout)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
__future__
เวอร์ชันจะไม่รวมflush
เพราะ "อาร์กิวเมนต์ flush ถูกเพิ่มใน Python 3.3 (หลังจากพิมพ์ () ถูก backported เป็น 2.7 ผ่านการนำเข้าในอนาคต)" bugs.python.org/issue28458