2017-09-30 8 views
0

Contexte: J'ai remarqué que le truc nohup python test.py & ne fonctionne généralement pas parce que la sortie ne soit pas correctement enregistré en temps réel à nohup.out. Les solutions données in this famous question (telles que nohup python -u) ne fonctionnent pas toujours, comme indiqué in my other question here.impression redéfinis pour ouvrir, écrire dans un fichier journal, près

Question: J'ai utilisé print(...) partout dans mon code, donc je ne veux pas changer cela et le remplacer par une autre fonction de journalisation. Est-il possible de redéfinir print de le faire à la place:

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

Quel est le problème avec la première réponse à votre question précédente? – user2357112

+0

@ user2357112 Si je me souviens bien, les solutions avec 'flush' n'ont pas fonctionné dans 100% des cas pour moi. – Basj

+0

Si 'flush' n'a pas fonctionné pour vous, il n'y a aucune raison de penser que' close' fonctionnera mieux. Vous devriez probablement regarder dans la cause première de vos problèmes nohup; ce que vous faites maintenant est fondamentalement le débogage de fusil de chasse. – user2357112

Répondre

0

Eh bien, vous pouvez remplacer la fonction builtin.

Considérez ceci 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 

Cela fonctionne aussi si vous redéfinissez la fonction builtin une seule fois dans un module Sigle, puis importer simplement - il aura une incidence sur l'application entière.

from __future__ import print_function 
import test 

print(300) # HELLO! 

Mais vous devez toujours importer du futur dans py2, toujours. Sinon, print ne sera pas une fonction intégrée, mais un opérateur, et donc jamais surchargé.

Cette astuce fonctionnera également dans py3, à l'exception que le nom du module est builtins. Donc, le code pourrait être comme ceci:

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)