2017-09-30 3 views
0

배경 :nohup.out에 실시간으로 올바르게 출력되지 않기 때문에 nohup python test.py &은 일반적으로 작동하지 않습니다. in this famous question (예 : nohup python -u)의 솔루션은 in my other question here과 같이 항상 작동하지 않을 수 있습니다.인쇄를 다시 정의하여 로그 파일에 기록하십시오.

질문 : 내 코드에 print(...)을 사용 했으므로 변경하지 않고 다른 로깅 기능으로 바꾸고 싶습니다. 그것이 가능 대신이 일을 print을 재정의합니다 :

from __future__ import print_function 

def print(s): 
    with open('out.txt', 'a+') as f: 
     f.write(str(s) + '\n') 
    old_print(s)  # how to print it with the standard print too? 
+0

이전 질문에 대한 첫 번째 답변의 잘못된 점은 무엇입니까? – user2357112

+0

@ user2357112 잘 기억한다면 '플러시'솔루션은 100 %의 경우에 작동하지 않았습니다. – Basj

+0

'flush'가 작동하지 않는다면'close'가 더 잘 작동 할 것이라고 기대할 이유가 없습니다. 아마 nohup 문제의 근본 원인을 조사해야합니다. 지금하고있는 일은 기본적으로 산탄 총 디버깅입니다. – user2357112

답변

0

글쎄, 당신은 내장 기능을 대체 할 수 있습니다.

이 test.py를 고려

from __future__ import print_function 

def new_print(*args, **kwargs): 
    old_print('HELLO!') 

import __builtin__ 
old_print = __builtin__.print 
__builtin__.print = new_print 

print(100) # -> HELLO! 
old_print(200) # -> 200 

그냥 가져올 다음 sigle 모듈에서 한 번만 내장 함수를 재정의하고, 경우에도 작동합니다 - 그것은 전체 응용 프로그램에 영향을 미칠 것입니다.

from __future__ import print_function 
import test 

print(300) # HELLO! 

하지만 여전히 py2에서 가져와야합니다. 그렇지 않으면, print는 내장 함수가 아니라 연산자이므로 절대 무시되지 않습니다.

이 트릭은 모듈 이름이 builtins 인 것을 제외하고 py3에서도 작동합니다. 따라서 코드는 다음과 같을 수 있습니다.

from __future__ import print_function 

def new_print(*args, **kwargs): 
    old_print('HELLO!') 

try: 
    import __builtin__ as bi # py2 
except ImportError: 
    import builtins as bi # py3 

old_print = bi.print 
bi.print = new_print 

print(100) 
old_print(200) 
관련 문제