Python의 print
기능을 화면에 출력하려면 어떻게 해야 합니까?
질문자 :Walter Nissen
Python 3에서 print
flush
인수를 취할 수 있습니다.
print("Hello, World!", flush=True)
Python 2에서는 다음을 수행해야 합니다.
import sys sys.stdout.flush()
print
를 호출한 후 기본적으로 print
는 sys.stdout
인쇄합니다(파일 객체에 대한 자세한 내용은 설명서 참조).
CesarB
python -h
실행하면 명령줄 옵션이 표시됩니다 .
-u : 버퍼링되지 않은 바이너리 stdout 및 stderr; 또한 PYTHONUNBUFFERED=x '-u'와 관련된 내부 버퍼링에 대한 자세한 내용은 매뉴얼 페이지를 참조하십시오.
다음은 관련 문서 입니다.
gimel
Python 3.3부터 sys.stdout.flush()
를 사용할 필요 없이 print()
함수를 강제로 비울 수 있습니다. "flush" 키워드 인수를 true로 설정하기만 하면 됩니다. 문서에서 :
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
sep로 구분되고 뒤에 end가 오는 스트림 파일에 개체를 인쇄합니다. sep, end 및 file(있는 경우)은 키워드 인수로 제공되어야 합니다.
키워드가 아닌 모든 인수는 str()과 같은 문자열로 변환되고 스트림에 기록되며 sep로 구분되고 뒤에 end가 옵니다. sep와 end는 모두 문자열이어야 합니다. 기본값을 사용함을 의미하는 None일 수도 있습니다. 객체가 제공되지 않으면 print()는 끝을 씁니다.
파일 인수는 write(string) 메서드가 있는 객체여야 합니다. 존재하지 않거나 None이면 sys.stdout이 사용됩니다. 출력이 버퍼링되는지 여부는 일반적으로 파일에 의해 결정되지만 flush 키워드 인수가 true이면 스트림이 강제로 플러시됩니다.
Eugene Sajine
Python 인쇄의 출력을 플러시하는 방법은 무엇입니까?
저는 이렇게 하는 다섯 가지 방법을 제안합니다.
- Python 3에서
print(..., flush=True)
호출합니다(플러시 인수는 Python 2의 인쇄 함수에서 사용할 수 없으며 print 문에 대한 유사점이 없음). -
file.flush()
를 호출합니다(이 작업을 수행하기 위해 python 2의 인쇄 기능을 래핑할 수 있음)(예:sys.stdout
- 부분 함수가 있는 모듈의 모든 인쇄 함수 호출에 이것을 적용합니다.
print = partial(print, flush=True)
모듈 전역에 적용되었습니다. - 이것을 인터프리터 명령에 전달
-u
)로 프로세스에 적용하십시오. -
PYTHONUNBUFFERED=TRUE
환경의 모든 python 프로세스에 이것을 적용하십시오(그리고 이를 실행 취소하려면 변수 설정을 해제하십시오).
파이썬 3.3 이상
Python 3.3 이상을 사용 print
함수에 대한 키워드 인수로 flush=True
print('foo', flush=True)
파이썬 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
모듈을 참조하십시오 .
또는 Python 2의 print 문과 같이 인쇄 후 file.flush()
호출할 수 있습니다.
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의 라인용)에는 내부 버퍼링이 있습니다. 이 문제를 해결하려면 while 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.
Aaron Hall
또한 이 블로그 게시물 에서 제안한 것처럼 버퍼되지 않은 모드에서 sys.stdout
을 다시 열 수 있습니다.
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
각 stdout.write
및 print
작업은 나중에 자동으로 플러시됩니다.
Antony Hatchkins
Python 3.x에서는 print()
함수가 확장되었습니다.
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
따라서 다음을 수행할 수 있습니다.
print("Visiting toilet", flush=True)
Noah Krasser
-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)
... 이제 sys.stdout
암시적으로 사용하는 print
flush
됩니다.
Dan Lenski
버퍼링되지 않은 파일 사용:
f = open('xyz.log', 'a', 0)
또는
sys.stdout = open('out.log', 'a', 0)
Frank
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):
잘 작동합니다.
Kamil Kisiel
다음은 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()
guettli
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)
user263387
Python 3.4에서 다음과 같이 했습니다.
'''To write to screen in real-time''' message = lambda x: print(x, flush=True, end="") message('I am flushing out now...')
kmario23
나는 먼저 플러시 옵션이 어떻게 작동하는지 이해하려고 애썼다. 나는 '로딩 디스플레이'를 하고 싶었고 여기 내가 찾은 해결책이 있습니다:
for i in range(100000): print('{:s}\r'.format(''), end='', flush=True) print('Loading index: {:d}/100000'.format(i+1), end='')
첫 번째 줄은 이전 인쇄를 플러시하고 두 번째 줄은 새로 업데이트된 메시지를 인쇄합니다. 여기에 한 줄 구문이 있는지 모르겠습니다.
Guillaume Mougeot
출처 : http:www.stackoverflow.com/questions/230751/how-can-i-flush-the-output-of-the-print-function
'etc. > StackOverFlow' 카테고리의 다른 글
PHP에서 어떻게 리디렉션합니까? (0) | 2022.07.06 |
---|---|
주어진 요소에 클래스를 추가하는 방법은 무엇입니까? (0) | 2022.07.06 |
전체 경로가 주어진 모듈을 가져오는 방법은 무엇입니까? (0) | 2022.07.06 |
JSON 데이터를 파일에 어떻게 쓰나요? (0) | 2022.07.06 |
MVC와 MVVM의 차이점은 무엇입니까? [닫은] (0) | 2022.07.06 |