print
Python の関数を強制的に画面に出力するにはどうすればよいですか?
13 に答える
Python 3 ではprint
、オプションのflush
引数を取ることができます:
print("Hello, World!", flush=True)
Python 2では、あなたがしなければならないでしょう
import sys
sys.stdout.flush()
電話した後print
。デフォルトでは、print
出力先(ファイル オブジェクトsys.stdout
の詳細については、ドキュメントを参照してください)。
を実行python -h
すると、コマンド ライン オプションが表示されます。
-u : バッファリングされていないバイナリ stdout および stderr。また、PYTHONUNBUFFERED=x 「-u」に関連する内部バッファリングの詳細については、man ページを参照してください
関連するドキュメントは次のとおりです。
Python 3.3 以降では、 ;print()
を使用せずに通常の関数を強制的にフラッシュできます。sys.stdout.flush()
「flush」キーワード引数を true に設定するだけです。ドキュメントから:
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
オブジェクトをストリーム ファイルに出力します。sep で区切られ、その後に end が続きます。sep、end、file が存在する場合は、キーワード引数として指定する必要があります。
すべての非キーワード引数は、str() のように文字列に変換され、sep で区切られて end が続くストリームに書き込まれます。sep と end は両方とも文字列でなければなりません。None にすることもできます。これは、デフォルト値を使用することを意味します。オブジェクトが指定されていない場合、print() は単に end を書き込みます。
file 引数は、write(string) メソッドを持つオブジェクトでなければなりません。存在しないか None の場合、sys.stdout が使用されます。通常、出力がバッファリングされるかどうかはファイルによって決定されますが、flush キーワード引数が true の場合、ストリームは強制的にフラッシュされます。
Python print の出力をフラッシュするには?
これを行うには、次の 5 つの方法をお勧めします。
- Python 3 では、呼び出します
print(..., flush=True)
(flush 引数は Python 2 の print 関数では使用できず、print ステートメントに類似するものはありません)。 - 出力ファイルを呼び出し
file.flush()
ます (これを行うには、python 2 の print 関数をラップできます)。たとえば、sys.stdout
print = partial(print, flush=True)
モジュールグローバルに適用された部分関数を使用して、モジュール内のすべての印刷関数呼び出しにこれを適用します。-u
インタープリター コマンドに渡されるフラグ ( ) を使用して、これをプロセスに適用します。- これを環境内のすべてのpythonプロセスに適用します
PYTHONUNBUFFERED=TRUE
(変数を設定解除してこれを元に戻します)。
Python 3.3+
Python 3.3 以降を使用すると、関数flush=True
のキーワード引数として次のように指定できます。print
print('foo', flush=True)
Python 2 (または < 3.3)
彼らは引数を Python 2.7 にバックポートしませんでしたflush
。したがって、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()
または、たとえば、Python 2 の print ステートメントを使用して、印刷後に呼び出すこともできます。
import sys
print 'delayed output'
sys.stdout.flush()
あるモジュールのデフォルトをflush=True
モジュールのグローバル スコープで functools.partial を使用して、print 関数のデフォルトを変更できます。
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
関数を覆い隠すためです (または、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() とファイル オブジェクト (sys.stdin の行) には内部バッファリングがあることに注意してください。これを回避するには、while 1: ループ内で file.readline() を使用します。
シェル動作環境のデフォルトの変更
環境変数を空でない文字列に設定すると、環境または環境から継承する環境内のすべての python プロセスでこの動作を取得できます。
たとえば、Linux または OSX の場合:
$ export PYTHONUNBUFFERED=TRUE
または Windows:
C:\SET PYTHONUNBUFFERED=TRUE
ドキュメントから:
バッファリングされていない
これが空でない文字列に設定されている場合、-u オプションを指定するのと同じです。
補遺
Python 2.7.12 の print 関数のヘルプは次のとおりです。引数がないことに注意してください。 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.
また、このブログ投稿で提案されているようにsys.stdout
、バッファなしモードで再度開くことができます。
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
stdout.write
その後、各print
操作は自動的にフラッシュされます。
Python 3.x では、print()
関数が拡張されました。
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
したがって、次のことができます。
print("Visiting toilet", flush=True)
コマンド ライン スイッチを使用しても-u
機能しますが、少し扱いにくいです。これは、ユーザーがオプションなしでスクリプトを呼び出した場合、プログラムが正しく動作しない可能性があることを意味し-u
ます。私は通常stdout
、次のように custom を使用します。
class flushfile:
def __init__(self, f):
self.f = f
def write(self, x):
self.f.write(x)
self.f.flush()
import sys
sys.stdout = flushfile(sys.stdout)
... これで、print
(暗黙的に使用する) すべての呼び出しsys.stdout
が自動的にflush
編集されます。
バッファリングされていないファイルを使用します。
f = open('xyz.log', 'a', 0)
または
sys.stdout = open('out.log', 'a', 0)
Python 3 では、 print関数をデフォルト設定で上書きできます。flush = True
def print(*objects, sep=' ', end='\n', file=sys.stdout, flush=True):
__builtins__.print(*objects, sep=sep, end=end, file=file, flush=flush)
ダンのアイデアはうまくいきません:
#!/usr/bin/env python
class flushfile(file):
def __init__(self, f):
self.f = f
def write(self, x):
self.f.write(x)
self.f.flush()
import sys
sys.stdout = flushfile(sys.stdout)
print "foo"
結果:
Traceback (most recent call last):
File "./passpersist.py", line 12, in <module>
print "foo"
ValueError: I/O operation on closed file
問題は、ファイルクラスから継承することだと思いますが、実際には必要ありません。sys.stdoutのドキュメントによると:
stdoutとstderrは、組み込みのファイルオブジェクトである必要はありません。文字列引数をとるwrite()メソッドがあれば、どのオブジェクトでもかまいません。
だから変わる
class flushfile(file):
に
class flushfile(object):
それがうまく機能するようにします。
これが私のバージョンで、writelines()とfileno()も提供しています。
class FlushFile(object):
def __init__(self, fd):
self.fd = fd
def write(self, x):
ret = self.fd.write(x)
self.fd.flush()
return ret
def writelines(self, lines):
ret = self.writelines(lines)
self.fd.flush()
return ret
def flush(self):
return self.fd.flush
def close(self):
return self.fd.close()
def fileno(self):
return self.fd.fileno()
私はPython 3.4で次のようにしました:
'''To write to screen in real-time'''
message = lambda x: print(x, flush=True, end="")
message('I am flushing out now...')