1458

printPython の関数を強制的に画面に出力するにはどうすればよいですか?

4

13 に答える 13

1716

Python 3 ではprint、オプションのflush引数を取ることができます:

print("Hello, World!", flush=True)

Python 2では、あなたがしなければならないでしょう

import sys
sys.stdout.flush()

電話した後print。デフォルトでは、print出力先(ファイル オブジェクトsys.stdoutの詳細については、ドキュメントを参照してください)。

于 2008-10-23T18:04:59.083 に答える
396

を実行python -hすると、コマンド ライン オプションが表示されます。

-u : バッファリングされていないバイナリ stdout および stderr。また、PYTHONUNBUFFERED=x 「-u」に関連する内部バッファリングの詳細については、man ページを参照してください

関連するドキュメントは次のとおりです。

于 2008-10-23T18:06:49.377 に答える
336

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 の場合、ストリームは強制的にフラッシュされます。

于 2014-04-17T20:10:31.917 に答える
244

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.
于 2016-02-17T21:01:03.190 に答える
70

また、このブログ投稿で提案されているようにsys.stdout、バッファなしモードで再度開くことができます。

sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

stdout.writeその後、各print操作は自動的にフラッシュされます。

于 2012-02-27T08:38:27.307 に答える
67

Python 3.x では、print()関数が拡張されました。

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)

したがって、次のことができます。

print("Visiting toilet", flush=True)

Python ドキュメント エントリ

于 2015-10-21T17:23:32.100 に答える
39

コマンド ライン スイッチを使用しても-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編集されます。

于 2008-10-23T19:54:26.740 に答える
19

バッファリングされていないファイルを使用します。

f = open('xyz.log', 'a', 0)

または

sys.stdout = open('out.log', 'a', 0)
于 2009-04-12T10:57:58.520 に答える
15

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)
于 2016-05-15T19:13:34.027 に答える
14

ダンのアイデアはうまくいきません:

#!/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):

それがうまく機能するようにします。

于 2008-11-13T22:15:25.260 に答える
12

これが私のバージョンで、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()
于 2011-05-19T08:20:36.630 に答える
7

私はPython 3.4で次のようにしました:

'''To write to screen in real-time'''
message = lambda x: print(x, flush=True, end="")
message('I am flushing out now...')
于 2015-06-06T11:10:54.547 に答える