ProgramingTip

인쇄 기능의 출력을 어떻게 플러시하고?

bestdevel 2020. 9. 27. 13:16
반응형

인쇄 기능의 출력을 어떻게 플러시하고?


출력의 인쇄 기능을 화면에 출력해야합니까?

이것은 귀하의 버퍼링 입니다. 링크 된 질문은 버퍼링되지 않은 출력을 시도하지만 일반적입니다. 질문의 상위 답변이 강력하거나 관련이 있고 해당이에 대한 답변 좋은이 아닙니다)이 질문은 너무 많은 질문의 답변이 있습니다.


파이썬 3에서는 선택적 인수를 사용할 수 있습니다.printflush

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

파이썬 2에서는 다음을 수행해야합니다.

import sys
sys.stdout.flush()

전화 후 print. 으로 기본적 인쇄합니다 ( 파일 object-에 , 대한 자세한 내용은 설명서 참조 ).printsys.stdout


실행 python -h하면 명령 줄 옵션이 표시 됩니다.

-u : 버퍼링되지 않은 바이너리 stdout 및 stderr; 또한 PYTHONUNBUFFERED = x '-u'와 관련된 내부 버퍼링에 대한 자세한 내용은 man 페이지를 참조한다.

다음은 관련 문서 입니다.


파이썬 3.3 또는 일반부터는 print()함수를 사용할 필요없이 강제 로 플러시 할 수 있습니다 sys.stdout.flush(). "flush"키워드 인수를 true로 설정하기 만하면됩니다. 에서 문서 :

print (* 객체, sep = '', end = '\ n', 파일 = sys.stdout, flush = False)

sep와 end로 구분 된 스트림 파일에 개체를 인쇄합니다. sep, end 및 file (있는 경우)은 키워드 인수로 제공되어야합니다.

키워드가 아닌 모든 인수는 str ()처럼 문자열 변환되고 sep로 구분 된 후 끝으로 구분 된 스트림에 기록됩니다. sep와 end는 모두 있어야합니다. 통신을 사용하는 없음 일 수도 있습니다. 성이있는 주어지지는 print ()는 그냥 끝을 씁니다.

파일 인수는 메소드가있는 객체를 작성합니다. 존재하지 않을 경우 인 경우 sys.stdout이 사용됩니다. 출력이 버퍼링 매개 변수는 일반적으로 파일에 의해 결정됩니다. 플러시 키워드 인수가 true이면 스트림이 강제로 플러시됩니다.


Python print의 출력을 플러시하는 방법은 무엇입니까?

이를 수행하는 다섯 가지 방법을 제안합니다.

  • Python 3에서 호출합니다 print(..., flush=True)(Python 2 print 함수에서는 플러시 인수를 사용할 수 있습니다 print 문에 대한 아날로그도 없습니다).
  • file.flush()출력 파일을 호출 합니다 (이 작업을 수행하기 위해 python 2의 인쇄 함수를 래핑 할 수 있음). 예를 들면 다음과 같습니다.sys.stdout

  • print = partial(print, flush=True)모듈 전역에 적용되는 부분 함수가있는 모듈의 모든 인쇄 함수 호출에 적용 됩니다.
  • -u인터프리터 명령에 전달 플래그 ( ) 를 사용하여 프로세스에 적용합니다.
  • 설치를 사용하여 환경의 모든 설치 프로세스에 적용하십시오. PYTHONUNBUFFERED=TRUE(그리고 실행 취소 변수를 설정 해제하십시오).

Python 3.3 이상

Python 3.3 이상을 사용 flush=True하면 print함수에 키워드 인수로 제공 할 수 있습니다 .

print('foo', flush=True) 

Python 2 (또는 <3.3)

그들은 flushPython 2.7에 대한 인수를 백 포트하지 않습니다. 따라서 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을 사용하여 인쇄 기능의 사용을 사용합니다.

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 () 및 File Objects (sys.stdin의 행)에 내부 버퍼링이 있습니다. 이 문제를 해결하려면 while 1 : 루프 내에서 file.readline ()을 사용하는 것이 좋습니다.

쉘 운영 환경의 기본값 변경

환경 변수를 비어 있지 않은 문자열로 설정하면 환경에서 상속하는 환경 또는 환경의 모든 Python 프로세스에 대해이 동작을 얻을 수 있습니다.

예 : Linux 또는 OSX :

$ export PYTHONUNBUFFERED=TRUE

또는 Windows :

C:\SET PYTHONUNBUFFERED=TRUE

로부터 문서 :

PYTHONUNBUFFERED

비어 있지 않은 문자열로 설정하면 -u 옵션을 지정하는 것과 같습니다.


추가

다음은 Python 2.7.12의 인쇄 기능에 대한 도움말입니다. 인수 없습니다 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.writeprint작업은 나중에 자동으로 플러시됩니다.


Python 3.x에서는 print()함수가 확장되었습니다.

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

따라서 다음을 수행 할 수 있습니다.

print("Visiting toilet", flush=True)

Python 문서 항목


-u명령 줄 스위치를 사용하면 작동하지만 약간 어색합니다. 사용자가 -u옵션 없이 스크립트를 호출하면 프로그램이 잠재적으로 잘못 작동 할 수 있음을 의미합니다 . 나는 보통 stdout다음과 같은 사용자 정의를 사용합니다 .

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)

Dan의 아이디어는 제대로 작동하지 않습니다.

#!/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에서는 기본 설정으로 인쇄 기능을 덮어 쓸 수 있습니다. flush = True

def print(*objects, sep=' ', end='\n', file=sys.stdout, flush=True):
    __builtins__.print(*objects, sep=sep, end=end, file=file, flush=flush)

Python 3.4에서 이렇게했습니다.

'''To write to screen in real-time'''
message = lambda x: print(x, flush=True, end="")
message('I am flushing out now...')

참고 URL : https://stackoverflow.com/questions/230751/how-to-flush-output-of-print-function

반응형