Làm thế nào để tuôn ra đầu ra của Python in?
Tôi đề nghị năm cách để làm điều này:
- Trong Python 3, gọi
print(..., flush=True)
(đối số tuôn ra không có sẵn trong chức năng in của Python 2 và không có tương tự cho câu lệnh in).
- Gọi
file.flush()
tệp đầu ra (chúng ta có thể bọc chức năng in của python 2 để làm điều này), ví dụ:sys.stdout
- áp dụng điều này cho mọi lệnh gọi chức năng in trong mô-đun với chức năng một phần,
print = partial(print, flush=True)
được áp dụng cho mô-đun toàn cầu.
- áp dụng điều này cho quá trình với một cờ (
-u
) được truyền cho lệnh phiên dịch
- áp dụng điều này cho mọi quá trình python trong môi trường của bạn với
PYTHONUNBUFFERED=TRUE
(và bỏ đặt biến để hoàn tác điều này).
Python 3,3+
Sử dụng Python 3.3 trở lên, bạn chỉ có thể cung cấp flush=True
làm đối số từ khóa cho print
hàm:
print('foo', flush=True)
Python 2 (hoặc <3.3)
Họ không đưa ra flush
đối số cho Python 2.7 Vì vậy, nếu bạn đang sử dụng Python 2 (hoặc nhỏ hơn 3.3) và muốn mã tương thích với cả 2 và 3, tôi có thể đề xuất mã tương thích sau. (Lưu ý __future__
nhập phải ở / rất "gần đầu mô-đun của bạn "):
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()
Mã tương thích ở trên sẽ bao gồm hầu hết các sử dụng, nhưng để xử lý triệt để hơn nhiều, hãy xem six
mô-đun .
Ngoài ra, bạn chỉ có thể gọi file.flush()
sau khi in, ví dụ, với câu lệnh in trong Python 2:
import sys
print 'delayed output'
sys.stdout.flush()
Thay đổi mặc định trong một mô-đun thành flush=True
Bạn có thể thay đổi mặc định cho chức năng in bằng cách sử dụng funcools.partial trên phạm vi toàn cầu của mô-đun:
import functools
print = functools.partial(print, flush=True)
nếu bạn nhìn vào hàm một phần mới của chúng tôi, ít nhất là trong Python 3:
>>> print = functools.partial(print, flush=True)
>>> print
functools.partial(<built-in function print>, flush=True)
Chúng ta có thể thấy nó hoạt động giống như bình thường:
>>> print('foo')
foo
Và chúng ta thực sự có thể ghi đè mặc định mới:
>>> print('foo', flush=False)
foo
Lưu ý một lần nữa, điều này chỉ thay đổi phạm vi toàn cầu hiện tại, vì tên in trên phạm vi toàn cầu hiện tại sẽ làm lu mờ print
chức năng dựng sẵn (hoặc bỏ qua chức năng tương thích, nếu sử dụng một trong Python 2, trong phạm vi toàn cầu hiện tại đó).
Nếu bạn muốn thực hiện điều này bên trong một hàm thay vì trên phạm vi toàn cầu của mô-đun, bạn nên đặt cho nó một tên khác, ví dụ:
def foo():
printf = functools.partial(print, flush=True)
printf('print stuff like this')
Nếu bạn khai báo nó là một hàm toàn cục, bạn đang thay đổi nó trên không gian tên toàn cầu của mô-đun, vì vậy bạn chỉ nên đặt nó trong không gian tên toàn cầu, trừ khi hành vi cụ thể đó là chính xác những gì bạn muốn.
Thay đổi mặc định cho quá trình
Tôi nghĩ rằng lựa chọn tốt nhất ở đây là sử dụng -u
cờ để có được đầu ra không có bộ đệm.
$ python -u script.py
hoặc là
$ python -um package.module
Từ các tài liệu :
Buộc stdin, stdout và stderr phải hoàn toàn không có bộ đệm. Trên các hệ thống có vấn đề, cũng đặt stdin, stdout và stderr ở chế độ nhị phân.
Lưu ý rằng có bộ đệm nội bộ trong file.readlines () và Đối tượng tệp (đối với dòng trong sys.stdin) không bị ảnh hưởng bởi tùy chọn này. Để giải quyết vấn đề này, bạn sẽ muốn sử dụng file.readline () trong vòng lặp 1:.
Thay đổi mặc định cho môi trường vận hành shell
Bạn có thể có hành vi này cho tất cả các quy trình python trong môi trường hoặc môi trường kế thừa từ môi trường nếu bạn đặt biến môi trường thành một chuỗi không trống:
ví dụ: trong Linux hoặc OSX:
$ export PYTHONUNBUFFERED=TRUE
hoặc Windows:
C:\SET PYTHONUNBUFFERED=TRUE
từ các tài liệu :
PYTHONUNBUFFERED
Nếu điều này được đặt thành một chuỗi không trống, nó tương đương với việc chỉ định tùy chọn -u.
Phụ lục
Đây là trợ giúp về chức năng in từ Python 2.7.12 - lưu ý rằng không có flush
đối số:
>>> 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__
phiên bản không bao gồmflush
vì "đối số tuôn ra đã được thêm vào Python 3.3 (sau khi in () được nhập vào 2.7 thông qua quá trình nhập trong tương lai)" bug.python.org/su28458