2016-04-09 9 views
0

Das ist, was ich habe:Ich brauche die stdout für eine Zeile zu überschreiben, und kehrt dann die Änderung

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 

Dies liegt daran, tabulate (automatisch) nach stdout schreibt, und ich muss es die schreiben Datei.

Mein Problem ist jedoch, dass stdout für nichts anderes im Programm funktioniert.

In dem obigen Beispiel würde helloworld nicht gedruckt werden, was muss ich ändern?

+0

Ich würde vorschlagen, dass Sie eine Pull-Anfrage an NLTK machen, die einen optionalen Parameter hinzufügt, um Aufrufe wie 'tabulate (file = sys.stdout) 'zu ermöglichen. Es wäre die sauberste Lösung. – firegurafiku

+0

Woher rennst du das und welche Version von Python? –

Antwort

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

Das war es, danke. –

0

Versuchen:

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

Wie läufst du das? Ich bekomme dieses Verhalten auf IDLE, wo die normale stdout ersetzt wurde, und __stdout__ auf None festgelegt.

Sie könnten unittest.mock.patch verwenden, um die temporäre Umleitung von stdout für Sie zu behandeln. Die Verwendung der with-Anweisung bedeutet, dass stdout zurückgesetzt wird, auch wenn eine Ausnahme in Ihrem Codeblock vorhanden ist.

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

Sie können dieses Problem lösen werden: Das Skript, das das stdout in eine Datei und bekommt die entsprechenden Werte als Argument und dann weiter den Fluss in dem aufrufende Skript ohne Umleiten der stdout umleiten:

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")