문제

Python의 인쇄 기능을 화면에 출력하도록하려면 어떻게해야합니까?

이것은 복제본이 아닙니다 출력 버퍼링을 비활성화합니다 - 연결된 질문은 부패하지 않은 출력을 시도하는 반면, 이는 더 일반적입니다. 그 질문의 가장 큰 답변은 너무 강력하거나 이것에 대해 관여하고 있으며 (이것에 대한 좋은 답변은 아닙니다),이 질문은 Google에서 상대적인 초보자가 찾을 수 있습니다.

도움이 되었습니까?

해결책

import sys
sys.stdout.flush()

print 기본적으로 인쇄 sys.stdout.

참조

파이썬 2

파이썬 3

다른 팁

달리기 python -h, 나는 a 명령 줄 옵션:

-U : 부패하지 않은 이진 성별 및 stderr; 또한 pythonunbuffered = x '-u'와 관련된 내부 버퍼링에 대한 자세한 내용은 MAN 페이지를 참조하십시오.

여기에 있습니다 관련 문서.

Python 3.3 이후로 정상을 강요 할 수 있습니다 print() 사용할 필요없이 플러시 할 수 있습니다 sys.stdout.flush(); "플러시"키워드 인수를 true로 설정하십시오. 에서 문서:

print (*Objects, sep = '', end = ' n', file = sys.stdout, flush = false)

객체를 스트림 파일에 인쇄하고 9 월에 분리 한 후 끝이 뒤 따릅니다. SEP, END 및 파일은 현재 존재하는 경우 키워드 인수로 제공되어야합니다.

모든 비 키워드 인수는 str () dos와 같은 문자열로 변환되어 스트림에 기록되며 Sep으로 분리 된 다음 끝이 뒤 따릅니다. 9 월과 끝 모두 줄이어야합니다. 또한 없을 수도 있습니다. 이는 기본값을 사용하는 것을 의미합니다. 객체가 주어지지 않으면 print ()는 끝을 씁니다.

파일 인수는 write (string) 메소드가있는 개체 여야합니다. 존재하지 않거나 없으면 sys.stdout이 사용됩니다. 출력이 버퍼링되는지 여부는 일반적으로 파일에 의해 결정되지만 플러시 키워드 인수가 사실이면 스트림이 강제로 플러시됩니다.

파이썬 프린트의 출력을 플러시하는 방법?

이 작업을 수행하는 5 가지 방법을 제안합니다.

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

Python 2 (또는 <3.3)

그들은 백 포트를하지 않았다 flush Python 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의 인쇄 문으로 인쇄 후 :

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 () 및 파일 개체 (Sys.stdin의 라인)에 내부 버퍼링이 있습니다. 이 문제를 해결하려면 File.Readline ()을 사용하여 시간 1 : 루프를 사용하려고합니다.

쉘 작동 환경의 기본값 변경

환경 변수를 비어 있지 않은 문자열로 설정하면 환경에서 상속되는 환경 또는 환경의 모든 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.write 그리고 print 나중에 작동이 자동으로 플러시됩니다.

Python 3.x와 함께 print() 기능이 확장되었습니다.

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

그래서 당신은 그냥 할 수 있습니다 :

print("Visiting toilet", flush=True)

파이썬 문서 입력

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

나는 파이썬 3.4에서 이것을 좋아했다.

'''To write to screen in real-time'''
message = lambda x: print(x, flush=True, end="")
message('I am flushing out now...')
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top