J'ai un long script Python qui utilise souvent des déclarations d'impression, je me demandais s'il était possible d'ajouter du code qui enregistrerait toutes les instructions d'impression dans un fichier texte ou quelque chose comme ça. Je souhaite toujours que toutes les déclarations d'impression vont à la ligne de commande, car l'utilisateur est invité dans tout le programme. Si possible la journalisation de l'entrée de l'utilisateur serait également bénéfique. P>
J'ai trouvé ce qui répond quelque peu à ma question mais le rend où l'instruction "Imprimer" n'est plus imprimée à la ligne de commande p>
5 Réponses :
Vous pouvez ajouter ceci à votre script:
sys.stdout = backup
Voici un programme qui fait ce que vous décrivez:
#! /usr/bin/python3 class Tee: def write(self, *args, **kwargs): self.out1.write(*args, **kwargs) self.out2.write(*args, **kwargs) def __init__(self, out1, out2): self.out1 = out1 self.out2 = out2 import sys sys.stdout = Tee(open("/tmp/log.txt", "w"), sys.stdout) print("hello")
Pourquoi avez-vous utilisé tous les deux une classe et pourquoi sont-ils tous deux appelés tee code>?
J'ai utilisé une classe car impression code> sera éventuellement invoquer
sys.stdout.write () code>. Puisque je remplace
sys.stdout code>, mes besoins de remplacement doivent avoir un
.write () code>. Je l'ai appelé
T-shirt code> après le UNIX
TEE CODE> Programme
, qui est lui-même nommé d'après le Fixation de plomberie du même nom .
Intéressant. Avez-vous également exécuté mon programme autonome, sans votre code? A-t-il produit un /tmp/log.txt non vide code> alors?
@reddman - Vous pourriez essayer d'ajouter self.out1.flush () code> et
self.out2.flush () code> à
tee.write (): code> .
Si vous utilisez l'intégré Module de journalisation Vous pouvez configurer vos enregistreurs Avec autant de sorties que vous en avez besoin: Pour déposer, les bases de données, les e-mails, etc. Cependant, il vous semble que vous mélangez d'impression pour deux utilisations différentes: enregistrement (enregistrement du flux de programme pour une inspection ultérieure) et des invites. Les travaux réels seront de diviser ces deux utilisations de «impression» dans différentes fonctions afin d'obtenir ce dont vous avez besoin à chaque endroit. P>
Beaucoup de gens Remplacer Les SYS.STDOUT et SYS.STDERR de Python de Python sont automatiquement des trucs au texte qui est envoyé à la console. La véritable sortie de la console vit toujours dans sys .__ stdout __ code> et
sys .__ STDERR __ code> (vous n'avez donc pas besoin de vous inquiéter de "perdre"), mais si vous collez un objet Avec les mêmes méthodes qu'un fichier dans les variables
sys.stsdout code> et
sys.ssderr code> Vous pouvez faire ce que vous voulez avec le processus de sortie. P>
hm ... est-il difficile de mettre en œuvre votre propre fonction imprimée () et décorateur qui connectera tout ce qui est transmis à votre fonction d'impression?
Lorsque vous essayez la meilleure réponse acceptée sur Python 3.7, j'ai eu l'exception suivante: J'ai ajouté la fonction suivante pour le faire fonctionner: P> def flush(self):
pass
@ Robᵩ ha ha ha < / a>
@Stephan - Je ne pense pas que je suis drôle. J'essaie de comprendre ce qui veut vraiment de nous.
@ Robᵩ Je pense qu'il demande comment faire
imprimer "hi" code> aller à deux endroits différents avec 1 déclaration