[Compréhension et application de la syntaxe] Changement flexible de la destination de sortie standard Python

Je vais vous présenter comment utiliser la destination de sortie (sortie de fichier, sortie de console) de la sortie standard Python (print et sys.stdout) tout en basculant de manière appropriée avec la syntaxe.

Motivation

Vous pouvez modifier la destination de sortie de la sortie standard en fonction du traitement en procédant comme suit,

import sys
#Changer temporairement de sortie de fichier
sys.stdout = open('out.log', 'a+')

...
sys.stdout.write('fugahoge')
...

#Revenir à la sortie de la console
sys.stdout = sys.__stdout__

Lorsque le processus est terminé, je me demandais s'il y avait quelque chose car il serait gênant de le restaurer, et en me souvenant que l'utilisation de la syntaxe with rendait close () après le fichier open () inutile, cet article Je suis venu pour écrire.

Ce qui est écrit dans cet article

--Comment changer la sortie standard --Description de avec la syntaxe --Comment changer la destination de sortie de la sortie standard avec avec la syntaxe

avec syntaxe

La syntaxe with est utilisée dans diverses situations telles que la lecture et l'écriture de fichiers tels que le suivant et gradient_tape de tensorflow.

with open('', 'r') as f:
  f.read()

Référence: avec syntaxe (Python)

Que se passe-t-il dans la syntaxe avec

Ce qui se passe lorsque vous utilisez la syntaxe with, c'est que si vous spécifiez (ou générez) une instance après with, le processus s'exécutera comme suit.

  1. La méthode instantanée `` .__ enter__ () '' est appelée
  2. Traitement dans la syntaxe with
  3. La méthode instantanée `` .__ exit__ () '' est appelée

Exemple de code

Si vous exécutez le code suivant,

class Logger():
    def setIO(self, *args, **kwargs):
        #Générer TestIO instanse
        return TestIO(*args, **kwargs)

class TestIO():
    def __enter__(self):
        print('enter')

    def __exit__(self, *args):
        print('exit')

logger = Logger()
with logger.setIO():
    print('---- in with syntax ----')

La sortie est la suivante.

console


enter
---- in with syntax ----
exit

Vous pouvez maintenant voir que le traitement est effectué dans l'ordre de la méthode .__ enter__ () '' -> traitement dans la méthode with syntax-> .__ exit __ () ''.

référence:

Commutation flexible de la destination de sortie standard avec avec syntaxe

Enfin, je présenterai un exemple de code de "commutation flexible de la destination de sortie de la sortie standard avec avec syntaxe" qui fait l'objet de cet article.

import sys

class SetIO():
    """Je suis avec la syntaxe/Classe de commutation O"""
    def __init__(self, filename: str):
        self.filename = filename

    def __enter__(self):
        sys.stdout = _STDLogger(out_file=self.filename)

    def __exit__(self, *args):
        sys.stdout = sys.__stdout__

class _STDLogger():
    """Personnalisé I/O"""
    def __init__(self, out_file='out.log'):
        self.log = open(out_file, "a+")

    def write(self, message):
        self.log.write(message)

    def flush(self):
        # this flush method is needed for python 3 compatibility.
        pass

print('before with block')

with SetIO('out.log'):
    #Passer à la sortie de fichier
    print('---- in with syntax ----')

print('after with block')

Lorsque j'exécute le code ci-dessus, Ce qui suit est sorti sur la console.

console


before with block
after with block

Ensuite, ce qui suit est généré dans le fichier (out.log).

out.log


---- in with syntax ----

J'ai pu changer la destination de sortie standard avec la syntaxe par la méthode ci-dessus.

Résumé

Vous pouvez modifier la destination de sortie en utilisant l'espace de noms du module d'enregistrement intégré, mais je trouve qu'il est peu pratique de modifier la destination de sortie en détail. (Il est possible que vous ne soyez tout simplement pas familier avec l'enregistreur) Par conséquent, je pense qu'il existe des situations où la méthode présentée dans cet article peut être utilisée. J'espère que cela vous sera utile!

Refs

Recommended Posts

[Compréhension et application de la syntaxe] Changement flexible de la destination de sortie standard Python
UnicodeEncodeError lutte avec la sortie standard de python3
avec syntaxe (Python)
Reçoit et génère la sortie standard des implémentations Python 2 et Python 3> C
Obtenez une sortie standard en temps réel avec le sous-processus Python
Journal de sortie au format JSON avec journalisation standard Python
Bases de python: sortie
Application de Python 3 vars
[Pour les débutants] Résumé de l'entrée standard en Python (avec explication)
1. Statistiques apprises avec Python 2. Distribution des probabilités [Compréhension approfondie de scipy.stats]
Tester la sortie standard avec Pytest
Application Web avec Python + Flask ② ③
Compréhension complète du débogage Python
Application Web avec Python + Flask ④
Convertir en chaîne lors de la sortie de la sortie standard avec le sous-processus Python
Je veux sortir le début du mois prochain avec Python
Exportez le contenu de ~ .xlsx dans le dossier en HTML avec Python
Lire la sortie standard d'un sous-processus ligne par ligne en Python
[Blender] Liste des touches de raccourci pour la console Python fournie en standard avec Blender
L'histoire de la création d'un pilote standard pour db avec python.
Mémorandum lors de l'exécution de Python sur EC2 avec Apache
J'ai essayé de sortir la liste rpm de la destination de connexion SSH sur une feuille Excel avec Python + openpyxl.
Python: Application de l'apprentissage supervisé (retour)
Sortie vers un fichier csv avec Python
Entrée / sortie avec Python (mémo d'apprentissage Python ⑤)
Surveillez les performances des applications Python avec Dynatrace ♪
Rendre la sortie standard non bloquante en Python
Premiers pas avec Python Bases de Python
Conforme à la norme de codage Python PEP8
[Note] Sortie Hello world avec python
Sortie du journal de test unitaire avec python
Jeu de vie avec Python! (Le jeu de la vie de Conway)
[Python] Comprendre le potentiel_field_planning de Python Robotics
10 fonctions du "langage avec batterie" python
Implémentation de la méthode Dyxtra par python
RPC complété avec des modules Python 3 standard
Coexistence de Python2 et 3 avec CircleCI (1.0)
Développement d'applications avec Docker + Python + Flask
Application de Python: Nettoyage des données Partie 2: Nettoyage des données à l'aide de DataFrame
Application de graphiques avec des curseurs
Etude de base d'OpenCV avec Python
Sortie CSV des données d'impulsion avec Raspberry Pi (vérifier l'entrée analogique avec python)
Affichage immédiat, affichage forcé, clignotement du résultat d'impression avec python (principalement jupyter)
J'ai essayé de rationaliser le rôle standard des nouveaux employés avec Python
Explication de la création d'une application pour afficher des images et dessiner avec Python