Python baskı çıktısını nasıl temizlerim?
Bunu yapmanın beş yolunu öneririm:
- Python 3'te, call
print(..., flush=True)
(flush argümanı Python 2'nin yazdırma işlevinde kullanılamaz ve print deyimi için bir analog yoktur).
file.flush()
Çıktı dosyasını arayın (bunu yapmak için python 2'nin yazdırma işlevini sarabiliriz), örneğin,sys.stdout
print = partial(print, flush=True)
bunu, modüle global olarak uygulanan kısmi işlevli her yazdırma işlevi çağrısına uygulayın .
- bunu
-u
interpreter komutuna iletilen flag ( ) ile işleme uygulayın
- bunu ortamınızdaki her python işlemine ile uygulayın
PYTHONUNBUFFERED=TRUE
(ve bunu geri almak için değişkenin ayarını kaldırın ).
Python 3.3+
Python 3.3 veya üstünü flush=True
kullanarak, print
işleve bir anahtar kelime argümanı olarak girebilirsiniz :
print('foo', flush=True)
Python 2 (veya <3.3)
flush
Python 2.7'ye argümanı backport vermediler. Python 2 (veya 3.3'ten az) kullanıyorsanız ve hem 2 hem de 3 ile uyumlu kod istiyorsanız, aşağıdaki uyumluluk kodunu önerebilir miyim. ( __future__
İçe aktarmanın / modülünüzün üst kısmında / çok yakınında olması gerektiğini unutmayı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()
Yukarıdaki uyumluluk kodu çoğu kullanımı kapsayacaktır, ancak çok daha kapsamlı bir tedavi için six
modüle bakın .
Alternatif olarak, file.flush()
yazdırdıktan sonra, örneğin Python 2'deki print ifadesiyle arayabilirsiniz :
import sys
print 'delayed output'
sys.stdout.flush()
Bir modüldeki varsayılan değeri flush=True
Bir modülün global kapsamındaki functools.partial komutunu kullanarak yazdırma işlevi için varsayılanı değiştirebilirsiniz:
import functools
print = functools.partial(print, flush=True)
yeni kısmi fonksiyonumuza bakarsanız, en azından Python 3'te:
>>> print = functools.partial(print, flush=True)
>>> print
functools.partial(<built-in function print>, flush=True)
Normal gibi çalıştığını görebiliriz:
>>> print('foo')
foo
Ve aslında yeni varsayılanı geçersiz kılabiliriz:
>>> print('foo', flush=False)
foo
Yine, yalnızca geçerli global kapsamı değiştirdiğine dikkat edin, çünkü mevcut global kapsamdaki yazdırma adı yerleşik print
işlevi gölgede bırakacaktır (veya Python 2'de bir tane kullanılıyorsa uyumluluk işlevini geçerli global kapsamdan farklı kılacaktır).
Bunu bir modülün global kapsamı yerine bir fonksiyonun içinde yapmak istiyorsanız, ona farklı bir isim vermelisiniz, örneğin:
def foo():
printf = functools.partial(print, flush=True)
printf('print stuff like this')
Bir işlevde global olarak bildirirseniz, modülün global ad alanında değiştirirsiniz, bu nedenle, belirli bir davranış tam olarak istediğiniz şey olmadığı sürece, onu genel ad alanına koymanız gerekir.
İşlem için varsayılanı değiştirme
Bence buradaki en iyi seçenek, -u
arabelleksiz çıktı almak için bayrağı kullanmak .
$ python -u script.py
veya
$ python -um package.module
Gönderen docs :
Stdin, stdout ve stderr'i tamamen arabelleksiz olmaya zorlayın. Önemli olduğu sistemlerde, stdin, stdout ve stderr'i ikili moda da koyun.
Bu seçenekten etkilenmeyen file.readlines () ve Dosya Nesnelerinde (sys.stdin'deki satır için) dahili arabellekleme olduğuna dikkat edin. Bu sorunu gidermek için, bir süre 1: döngü içinde file.readline () kullanmak isteyeceksiniz.
Kabuk işletim ortamı için varsayılan değeri değiştirme
Ortam değişkenini boş olmayan bir dizeye ayarlarsanız, ortamdaki veya ortamdaki devralınan tüm python işlemleri için bu davranışı alabilirsiniz:
örneğin, Linux veya OSX'te:
$ export PYTHONUNBUFFERED=TRUE
veya Windows:
C:\SET PYTHONUNBUFFERED=TRUE
dan docs :
PYTHONUNBUFFERED
Bu boş olmayan bir dizeye ayarlanırsa, -u seçeneğini belirtmeye eşdeğerdir.
ek
İşte Python 2.7.12 yazdırma işlevini yardım var - olduğunu not hiçbir flush
argüman:
>>> 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__
sürüm,flush
"Python 3.3'e deşarj