103 votes

Comment rediriger stdout à la fois vers un fichier et vers la console avec un script ?

Je veux exécuter un script de python et capturer la sortie sur un fichier texte ainsi que vouloir montrer sur la console.

Je veux le spécifier comme une propriété du script python lui-même. PAS pour utiliser la commande echo "hello world" | tee test.txt à l'invite de commande à chaque fois.

Dans script j'ai essayé :

sys.stdout = open('log.txt','w')

Mais cela n'affiche pas la sortie stdout à l'écran.

J'ai entendu parler du module de journalisation mais je n'ai pas eu de chance en utilisant ce module pour faire le travail.

0voto

crazjo Points 385

Sur la base de Brian Burns a édité la réponse J'ai créé une classe unique qui est plus facile à appeler :

class Logger(object):

    """
    Class to log output of the command line to a log file

    Usage:
    log = Logger('logfile.log')
    print("inside file")
    log.stop()
    print("outside file")
    log.start()
    print("inside again")
    log.stop()
    """

    def __init__(self, filename):
        self.filename = filename

    class Transcript:
        def __init__(self, filename):
            self.terminal = sys.stdout
            self.log = open(filename, "a")
        def __getattr__(self, attr):
            return getattr(self.terminal, attr)
        def write(self, message):
            self.terminal.write(message)
            self.log.write(message)
        def flush(self):
            pass

    def start(self):
        sys.stdout = self.Transcript(self.filename)

    def stop(self):
        sys.stdout.log.close()
        sys.stdout = sys.stdout.terminal

0voto

DankMasterDan Points 318

Sur la base de la réponse de @Arnold Suiza, voici une fonction que vous pouvez exécuter une fois au début et après laquelle tout sera immédiatement imprimé dans le fichier stdout & file :

def print_to_file(filename):
    orig_stdout = sys.stdout  # capture original state of stdout

    class Unbuffered:
        def __init__(self, filename):
            self.stream = orig_stdout
            self.te = open(filename,'w')  # File where you need to keep the logs

        def write(self, data):
            self.stream.write(data)
            self.stream.flush()
            self.te.write(data)    # Write the data of stdout here to a text file as well
            self.te.flush()

    sys.stdout=Unbuffered(filename)

Maintenant, il suffit d'exécuter print_to_file('log.txt') au début du programme et vous êtes prêt à partir !

0voto

Atif Ali Points 21

Si vous êtes sous Linux, tapez simplement.

python -u script.py | tee log.txt

Cela s'imprimera dans la console ainsi que dans le fichier. N'oubliez pas non plus d'utiliser l'option -u sinon vous ne verrez pas de sortie dans la console.

-3voto

fxs Points 1

J'ai essayé ça :

"""
Transcript - direct print output to a file, in addition to terminal.

Usage:
    import transcript
    transcript.start('logfile.log')
    print("inside file")
    transcript.stop()
    print("outside file")
"""

import sys

class Transcript(object):

    def __init__(self, filename):
        self.terminal = sys.stdout, sys.stderr
        self.logfile = open(filename, "a")

    def write(self, message):
        self.terminal.write(message)
        self.logfile.write(message)

    def flush(self):
        # this flush method is needed for python 3 compatibility.
        # this handles the flush command by doing nothing.
        # you might want to specify some extra behavior here.
        pass

def start(filename):
    """Start transcript, appending print output to given filename"""
    sys.stdout = Transcript(filename)

def stop():
    """Stop transcript and return print functionality to normal"""
    sys.stdout.logfile.close()
    sys.stdout = sys.stdout.terminal
    sys.stderr = sys.stderr.terminal

-6voto

naveen tamanam Points 522

Vous pouvez rediriger la sortie vers un fichier en utilisant >> python avec la syntaxe "chevron" de print rint, comme indiqué dans le fichier docs

Voyons voir,

fp=open('test.log','a')   # take file  object reference 
print >> fp , "hello world"            #use file object with in print statement.
print >> fp , "every thing will redirect to file "
fp.close()    #close the file 

vérifier le fichier test.log vous aurez les données et pour imprimer sur la console, il suffit d'utiliser imprimé simple déclaration .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X