2016-04-09 1 views
0

C'est ce que j'ai:je dois remplacer le stdout pour une ligne, puis revenir le changement

cfd1 = nltk.ConditionalFreqDist(biglisttagged) 
sys.stdout = open(corpus_name+"-pos-word-freq.txt",'w') 
cfd1.tabulate() 
sys.stdout = sys.__stdout__ #this is supposed to revert the change, but it doesn't. 

print("helloword") #I need this to print to stdout 

C'est parce que tabulate() écrit automatiquement stdout, et je besoin d'écrire au fichier.

Cependant, mon problème est que stdout ne fonctionne pour rien d'autre dans le programme.

Dans l'exemple ci-dessus, helloworld ne serait pas imprimé, que dois-je changer?

+0

Je vous suggérerais de faire une requête pull à NLTK qui ajoute un paramètre optionnel pour rendre possible des appels comme 'tabulate (file = sys.stdout)'. Ce serait la solution la plus propre. – firegurafiku

+0

Où exécutez-vous cela et quelle version de python? –

Répondre

1
sys_stdout = sys.stdout 
sys.stdout = open(...) 
... 
sys.stdout = sys_stdout 
+0

Cela l'a fait, merci. –

0

Essayez:

cfd1 = nltk.ConditionalFreqDist(biglisttagged) 
stdout_save = sys.stdout 
sys.stdout = open(corpus_name+"-pos-word-freq.txt",'w') 
cfd1.tabulate() 
sys.stdout = stdout_save 

print("helloword") #I need this to print to stdout 
0

Comment utilisez-vous cela? Je reçois ce comportement sur IDLE, où le stdout normal a été remplacé, et __stdout__ mis à None.

Vous pouvez utiliser unittest.mock.patch pour gérer la redirection temporaire de stdout pour vous. L'utilisation de l'instruction with signifie que stdout sera réinitialisé, même s'il existe une exception dans votre bloc de code.

from unittest.mock import patch 

cfd1 = nltk.ConditionalFreqDist(biglisttagged) 

with open(corpus_name+"-pos-word-freq.txt", "w") as redirect, \ 
     patch("sys.stdout", new=redirect): 
    cfd1.tabulate() 

print("helloword") 
0

Vous pouvez résoudre ce problème en appelant le script qui redirigent le stdout dans un fichier et obtient les valeurs pertinentes comme arguments et puis continuer le flux dans le script d'appel sans rediriger stdout:

test1. py

import sys 
    cfd1=sys.argv[1] 
    sys.stdout = open(corpus_name+"-pos-word-freq.txt",'w') 
    cfd1.tabulate() 

test2.py

cfd1 = nltk.ConditionalFreqDist(biglisttagged) 
execfile("test1.py " + cfd1) 
print("helloword")