Bagaimana menyiram hasil cetak Python?
Saya menyarankan lima cara untuk melakukan ini:
- Dalam Python 3, panggil
print(..., flush=True)
(argumen flush tidak tersedia dalam fungsi cetak Python 2, dan tidak ada analog untuk pernyataan cetak).
- Panggil
file.flush()
file output (kita dapat membungkus fungsi cetak python 2 untuk melakukan ini), misalnya,sys.stdout
- terapkan ini untuk setiap panggilan fungsi cetak dalam modul dengan fungsi parsial,
print = partial(print, flush=True)
diterapkan pada modul global.
- terapkan ini pada proses dengan flag (
-u
) yang diteruskan ke perintah juru bahasa
- terapkan ini ke setiap proses python di lingkungan Anda dengan
PYTHONUNBUFFERED=TRUE
(dan hapus variabel untuk membatalkan ini).
Python 3.3+
Menggunakan Python 3.3 atau lebih tinggi, Anda bisa memberikan flush=True
argumen kata kunci untuk print
fungsi ini:
print('foo', flush=True)
Python 2 (atau <3.3)
Mereka tidak mendukung flush
argumen ke Python 2.7 Jadi jika Anda menggunakan Python 2 (atau kurang dari 3,3), dan ingin kode yang kompatibel dengan 2 dan 3, boleh saya sarankan kode kompatibilitas berikut. (Perhatikan __future__
impor harus di / sangat "dekat bagian atas modul Anda "):
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()
Kode kompatibilitas di atas akan mencakup sebagian besar kegunaan, tetapi untuk perawatan yang jauh lebih menyeluruh, lihat six
modul .
Atau, Anda bisa menelepon file.flush()
setelah mencetak, misalnya, dengan pernyataan cetak dengan Python 2:
import sys
print 'delayed output'
sys.stdout.flush()
Mengubah default dalam satu modul menjadi flush=True
Anda dapat mengubah default untuk fungsi cetak dengan menggunakan functools.partial pada lingkup global modul:
import functools
print = functools.partial(print, flush=True)
jika Anda melihat fungsi parsial baru kami, setidaknya dalam Python 3:
>>> print = functools.partial(print, flush=True)
>>> print
functools.partial(<built-in function print>, flush=True)
Kita bisa melihatnya berfungsi seperti biasa:
>>> print('foo')
foo
Dan kita benar-benar dapat mengganti default baru:
>>> print('foo', flush=False)
foo
Perhatikan lagi, ini hanya mengubah lingkup global saat ini, karena nama cetak pada lingkup global saat ini akan menaungi print
fungsi bawaan (atau membatalkan referensi fungsi kompatibilitas, jika menggunakan satu di Python 2, dalam lingkup global saat ini).
Jika Anda ingin melakukan ini di dalam fungsi alih-alih pada lingkup global modul, Anda harus memberinya nama yang berbeda, misalnya:
def foo():
printf = functools.partial(print, flush=True)
printf('print stuff like this')
Jika Anda mendeklarasikannya sebagai global dalam suatu fungsi, Anda mengubahnya di namespace global modul, jadi Anda harus meletakkannya di namespace global, kecuali perilaku spesifik itu persis seperti yang Anda inginkan.
Mengubah default untuk proses
Saya pikir opsi terbaik di sini adalah menggunakan -u
flag untuk mendapatkan output yang tidak dikompromikan.
$ python -u script.py
atau
$ python -um package.module
Dari dokumen :
Paksa stdin, stdout dan stderr untuk sepenuhnya tidak terganggu. Pada sistem yang penting, juga letakkan stdin, stdout dan stderr dalam mode biner.
Perhatikan bahwa ada buffering internal di file.readlines () dan File Objects (untuk baris di sys.stdin) yang tidak dipengaruhi oleh opsi ini. Untuk mengatasinya, Anda harus menggunakan file.readline () di dalam 1: loop sementara.
Mengubah default untuk lingkungan operasi shell
Anda bisa mendapatkan perilaku ini untuk semua proses python di lingkungan atau lingkungan yang mewarisi dari lingkungan jika Anda mengatur variabel lingkungan ke string yang kosong:
misalnya, di Linux atau OSX:
$ export PYTHONUNBUFFERED=TRUE
atau Windows:
C:\SET PYTHONUNBUFFERED=TRUE
dari dokumen :
PYTHONUNBUFFERED
Jika ini disetel ke string yang tidak kosong, itu sama dengan menentukan opsi -u.
Tambahan
Inilah bantuan pada fungsi cetak dari Python 2.7.12 - perhatikan bahwa tidak ada flush
argumen:
>>> 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__
versi tidak termasukflush
karena "argumen flush ditambahkan dalam Python 3.3 (setelah cetak () di-backport ke 2.7 melalui impor di masa mendatang)" bugs.python.org/issue28458