Programing

인쇄 함수 출력(비퍼 파이선 출력)을 플러시하려면 어떻게 해야 하는가?

c10106 2022. 4. 5. 21:59
반응형

인쇄 함수 출력(비퍼 파이선 출력)을 플러시하려면 어떻게 해야 하는가?

파이썬을 어떻게 강제하지?print화면에 출력할 수 있는 기능을 선택하십시오.

Python 3에서는 옵션으로 선택 가능flush주장:

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

파이톤 2에서 당신은 해야 할 것이다.

import sys
sys.stdout.flush()

부르면print. 기본적으로 인쇄 위치(파일 개체에 대한 자세한 내용은 설명서 참조)

달리기python -h, 명령줄 옵션이 표시됨:

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

다음은 관련 문서 입니다.

Python 3.3 이후로는 일반을 강제할 수 있다.print()사용할 필요 없이 플러시하는 기능sys.stdout.flush(); "instance" 키워드 인수를 true로 설정하십시오.설명서:

인쇄(*객체, sep=', end='\n', file=sys.stdout, flash=false)

객체를 stream 파일로 인쇄한 다음 sep로 구분하고 end로 끝내십시오. sep, end 및 file(있는 경우)은 키워드 인수로 제공되어야 한다.

모든 비키워드 논쟁은 str()와 같은 문자열로 변환되어 스트림에 쓰이고, 9월에 분리되어 그 뒤에 끝난다.sep와 end 모두 문자열이어야 하며, 기본값을 사용하는 None일 수도 있다.사물이 주어지지 않으면 인쇄()는 끝만 쓸 뿐이다.

파일 인수는 쓰기(문자열) 메서드가 있는 개체여야 하며, 존재하지 않거나 없는 경우 sys.stdout이 사용된다.출력 버퍼링 여부는 보통 파일에 의해 결정되지만 플러시 키워드 인수가 참이면 스트림이 강제로 플러시된다.

Python 인쇄의 출력을 플러시하는 방법?

5가지 방법을 제안한다:

  • 파이톤 3에서는, 전화를 건다print(..., flush=True)(Python 2의 인쇄 기능에는 플러시 인수를 사용할 수 없으며, 인쇄 문에는 아날로그가 없다.)
  • 부르다file.flush()예를 들어, 출력 파일(이를 위해 python 2의 인쇄 기능을 포장할 수 있음),sys.stdout
  • 모듈의 모든 인쇄 기능 호출에 부분 기능 적용,
    print = partial(print, flush=True)모듈 글로벌에 적용됨.
  • 이것을 플래그로 프로세스에 적용한다(-u)는 통역 명령에 전달됨
  • 이를 환경 내의 모든 파이선 프로세스에 적용PYTHONUNBUFFERED=TRUE(그리고 이 작업을 실행 취소하도록 변수를 설정 해제하십시오.)

파이톤 3.3+

Python 3.3 이상을 사용하면 그냥 제공할 수 있다.flush=True에 대한 키워드 논거로print함수:

print('foo', flush=True) 

파이톤 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()

위의 호환성 코드는 대부분의 용도에 적용되지만 보다 철저한 처리는 모듈을 참조하십시오.

아니면 그냥 전화해서file.flush()예를 들어 Python 2의 인쇄 문장으로 인쇄한 후:

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

그리고 우리는 실제로 새로운 디폴트(Default)를 재정의할 수 있다.

>>> 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.readline() 및 파일 개체(sys.stdin의 줄에 대한)에는 내부 버퍼링이 있다는 점에 유의하십시오.이 문제를 해결하려면 잠시 동안 1: 루프 내에서 file.readline()을 사용하십시오.

셸 운영 환경의 기본값 변경

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

예: Linux 또는 OSX:

$ export PYTHONUNBUFFERED=TRUE

또는 Windows:

C:\SET PYTHONUNBUFFERED=TRUE

문서로부터:

파이톤버퍼링

이 값을 비어 있지 않은 문자열로 설정하면 -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.write그리고print작동은 이후에 자동으로 플러시된다.

Python 3.x와 함께.print()기능이 확장됨:

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

따라서 다음과 같은 작업을 수행할 수 있다.

print("Visiting toilet", flush=True)

Python Docs 엔트리

-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)

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)

댄의 생각은 잘 먹히지 않는다.

#!/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는 파일 객체가 내장될 필요가 없음: 어떤 객체는 문자열 인수를 사용하는 writeproperty 메서드가 있는 한 허용된다.

그렇게 변해가는

class flushfile(file):

class flushfile(object):

잘 될 수 있게 해

다음은 내 버전이며, 이 버전에서는 쓰기 줄()과 필레노()도 제공된다.

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()

파이썬 3.4에서 이렇게 했는데.

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

나는 먼저 플러시 옵션이 어떻게 작동하는지 이해하려고 애썼다.나는 '로드 디스플레이'를 하고 싶었는데, 여기 내가 찾은 해결책이 있다.

for i in range(100000):
    print('{:s}\r'.format(''), end='', flush=True)
    print('Loading index: {:d}/100000'.format(i+1), end='')

첫 번째 줄은 이전 인쇄물을 플러시하고 두 번째 줄은 새로운 업데이트된 메시지를 인쇄한다.여기에 한 줄 구문이 있는지 모르겠다.

참조URL: https://stackoverflow.com/questions/230751/how-can-i-flush-the-output-of-the-print-function-unbuffer-python-output

반응형