2017-10-19 3 views
1

J'ai un script python qui est composé de plusieurs threads en cours d'exécution et ils ont des sorties d'impression pour signaler tout échec de connexion, par ex. pas ouvrir les ports, n'a pas réussi à se connecter, etc.Rediriger toutes les sorties du fichier python vers tinydb

J'ai essayé la base:

import sys 
sys.stdout = open('file', 'w') 

mais rien n'a été enregistré dans le fichier. J'essaie d'obtenir la sortie des sorties d'impression du système et de l'enregistrer dans tinydb. J'essaye de noter toutes les sorties dans tinydb. Comment puis-je faire ceci?

Est-il possible de récupérer toutes les sorties d'impression en continu et de les enregistrer dans un fichier json en utilisant tinydb?

+0

C'est une question python2 ou python3? Comment est-ce que vous «imprimez» réellement. Comment votre thread est réellement commencé. –

+0

Pas exactement un doublon mais lié https://stackoverflow.com/questions/9316023/python-2-7-print-to-file –

+0

C'est une question python3. Impression en utilisant l'impression de base ("....") '. Le fil commence à utiliser 'threading.Thread()' –

Répondre

0

En python3, vous devez utiliser print avec un argument de fichier si vous souhaitez remplacer stdout comme dit la documentation et comme indiqué dans cette question:

Python 2.7: Print to File

Cela vous donne le bloc de construction de base pour réaliser ce que vous cherchez. Vous n'êtes pas vraiment expliquer quoi que ce soit sur la façon dont vous vous attendez à utiliser avec tinydb ...

Cela dit, votre appel d'impression devrait ressembler à ceci:

fake_stdout = open('file', 'w') 
print(data, file=fake_stdout) 

Voilà.

Si pour certaines raisons que vous avez beaucoup de déclaration d'impression pour changer, vous pourriez faire quelque chose comme ceci:

Avoir un module avec un fil variable locale qui initialisées. regardez ici cette question: Thread local storage in Python

Ensuite, lorsque vous avez votre module configuré, vous pouvez ajouter cette déclaration dans tous vos fichiers qui a besoin d'une sortie standard d'impression différent

from special_print import local_print as print 

Tout ce que vous avez à faire est de définir un variables ThreadLocal dans votre module special_print puis définir quand un nouveau thread commence par quelque chose comme ceci:

def print_factory(fout): 
    def local_print(arg): 
     print(arg, file=fout) 
    return local_print 

dans chaque nouveau thread vous exécutez quelque chose comme ceci:

import special_print 
special_print.local_print = print_factory(fake_stdout) 

Ensuite, lorsque vous importez cette méthode print dans chacun de vos threads, ils afficheront correctement les données dans le fake_stdout que vous avez défini dans chaque thread.