2017-11-07 18 views
0

저는 파이썬에 문제가있는 것 같습니다. 파이썬 2.7.13과 파이썬 3.6.0을 레드햇 엔터프라이즈 리눅스 서버 릴리즈 7.1 (마이 포)에서 사용했습니다. 프로세스 출력을 모니터링하기 위해 tail -f을 사용하여 STDOUT 및 STDERR을 실시간으로 살펴 봅니다. 여기에있는 키워드는 버퍼링되지 않은 출력입니다. 인터넷에서 많은 제안은 python -u ... 또는 PYTHONUNBUFFERED=1 python ... 또는 stdbuf -e0 -o0 python ...과 같은 환경 변수 PYTHONUNBUFFERED를 사용한다고 말합니다. 그럼에도 불구하고 다음 테스트 스크립트에는 아무 것도 없습니다.파이썬이 버퍼링되지 않은 모드에서 작동하지 않습니다.

import sys 
import time 
while(True): 
    print("Test String") 
    time.sleep(1); 

다른 모든 명령의 경우 항상 출력이 버퍼링됩니다. STDERR을 사용할 때도 마찬가지입니다. STDERR이 기본적으로 버퍼링되지 않아야하기 때문에 여전히 혼란 스럽습니다. sys.stdout.flush() 또는 sys.stderr.flush()을 사용하는 것도 작업을 수행하지 않습니다. print() 안에 flush=True을 사용하면 의도 한대로 작동합니다.

버퍼를 사용하지 않고 즉시 출력을 플러시하기 위해 모든 프로그램을 편집 할 수 없기 때문에 코드를 편집하지 않아도되는 솔루션을 찾고 있습니다. 이것을 어떻게 할 수 있습니까?

답변을 기다리십시오!

+0

당신은 당신의 테스트 스크립트가 무엇을 기대합니까? –

+0

'print (flush = True)'함수를 무시할 수 있습니다. –

+1

그래서 원본 스크립트에는 모니터하고 싶은 심층 학습 및 신경망 단계가 포함되어 있습니다. 내 테스트 스크립트에서 출력을 버퍼링하지 않는지 확인하기 위해 더미 출력으로 좁혔다. @ElisByberi 때문에 코드를 편집해야합니다. 어떤 프로그램은 너무 거대해서 모든 것을 편집하기 위해 혼란 스러울 것입니다. 나는'python -u' 또는'PYTHONUNBUFFERED'를 찾고 있습니다. 대신 그들이 왜 작동하는지 알지 못합니다. 광고 된대로 작동하지 않습니다. – TheOrangeman

답변

2

파이썬 3에서 print() 함수를 재정의 할 수 있습니다.이 방법을 사용하면 스크립트에서 print() 함수를 각각 변경할 필요가 없습니다.

import builtins 


def print(*args): 
    builtins.print(*args, sep=' ', end='\n', file=None, flush=True) 


print(
    'hello', 'world', 
    'I have overrode print() function!', 
    1, # integer 
    [1, 2], # list 
    {1, 2}, # set 
    (1, 2), # tuple 
    {1: 2} # dict 
) 

인쇄됩니다 :

hello world I have overrode print() function! 1 [1, 2] {1, 2} (1, 2) {1: 2} 
+0

제안 해 주셔서 감사합니다. 불행하게도 출력은'('Test String',)'입니다. 'python -u' 또는'PYTHONUNBUFFERED'가 광고로 작동 할 때 가장 행복 할 것입니다 ... 옵션에 관해서 무엇인가 놓친다면 알고 계십니까? – TheOrangeman

+1

@ TheOrangeman 솔직히 말하면, 코드를 테스트하지 않았습니다. 나는 단지 예로서 그것을 넣었다. 이제 예상대로 작동합니다. 보고 해 주셔서 감사합니다. –

+0

@TheOrangeman이 명령을 사용해보십시오 :'python -e PYTHONUNBUFFERED = 0 yourscript.py' –