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/issue28458Juga seperti yang disarankan di blog ini, seseorang dapat membuka kembali
sys.stdout
dalam mode tidak dibangun:Masing
stdout.write
- masing danprint
operasi akan secara otomatis memerah sesudahnya.sumber
UnsupportedOperation: IOStream has no fileno.
Dengan Python 3.x
print()
fungsi telah diperluas:Jadi, Anda bisa melakukan:
Entri Python Documents
sumber
Menggunakan
-u
saklar baris perintah berfungsi, tetapi sedikit canggung. Ini berarti bahwa program tersebut berpotensi berperilaku salah jika pengguna memanggil skrip tanpa-u
opsi. Saya biasanya menggunakan kebiasaanstdout
, seperti ini:... Sekarang semua
print
panggilan Anda (yang menggunakansys.stdout
secara implisit), akan otomatisflush
diedit.sumber
def __getattr__(self,name): return object.__getattribute__(self.f, name)
Mengapa tidak mencoba menggunakan file yang tidak dibuat-buat?
ATAU
sumber
Ide Dan tidak cukup berhasil:
Hasil:
Saya percaya masalahnya adalah itu mewarisi dari kelas file, yang sebenarnya tidak perlu. Menurut dokumen untuk sys.stdout:
sangat berubah
untuk
membuatnya bekerja dengan baik.
sumber
Ini adalah versi saya, yang juga menyediakan writelines () dan fileno ():
sumber
file
, saya mendapatkan kesalahan. Tidak adafile
kelas.Dalam Python 3 Anda dapat menimpa fungsi cetak dengan pengaturan default ke
flush = True
sumber
Saya melakukannya seperti ini di Python 3.4:
sumber
Saya pertama kali berjuang untuk memahami bagaimana opsi flush bekerja. Saya ingin melakukan 'memuat tampilan' dan di sini adalah solusi yang saya temukan:
Baris pertama membersihkan cetakan sebelumnya dan baris kedua mencetak pesan baru yang diperbarui. Saya tidak tahu apakah ada sintaks satu baris di sini.
sumber