2017-10-13 3 views
0

Ich bin neu in Python. Ich habe eine separate Flasche Web-Anwendung, die die 'log.txt' Datei in Echtzeit liest (über AJAX) Das erwartete Ergebnis ist, dass es "Nachricht 1" zeigt und 5 Sekunden später zeigt "Nachricht 2". Dann habe ich die folgenden Skripte in die Dateien zu schreiben:Schließt Python (Flask) die Datei nicht korrekt?

Wenn ich einen Standalone-Python-Skript die folgenden Werke zu machen (ich sehe die erste Nachricht und 5 Sekunden später die zweite Nachricht):

f = sys.stdout = sys.stderr = open('static/staging/stdout/discovery.log', 'w') 
    print "Message 1" 
    f.close() 
    time.sleep(5) 

    f = sys.stdout = sys.stderr = open('static/log.txt', 'a') 
    print "Message 2" 
    f.close() 
    time.sleep(5) 

Als ich Legen Sie es als Teil einer Web-App, und die Funktion ist Anruf wie unten, sie erscheinen beide zusammen nach 10 Sekunden und nicht nacheinander. sowieso beides tut

@app.route('/mywriter/') 
def myApp(): 
    f = sys.stdout = sys.stderr = open('static/log.txt', 'w') 
    print "Message 1" 
    f.close() 
    time.sleep(5) 

    f = sys.stdout = sys.stderr = open('static/log.txt', 'a') 
    print "Message 2” 
    f.close() 
    time.sleep(5) 

ich in diesem Stadium muss darauf hinweisen, dass ich flush() und fsync() verwenden, aber von dem, was ich f.close() verstehen zu tun. Außerdem funktioniert es, wenn ich es als eigenständiges Skript ansetze, aber nicht, wenn ich es als Teil einer Webanwendung in eine Methode einfüge.

+3

Warum überschreiben Sie 'stdout/stderr'? Das ist sooooo falsch auf soooo vielen Ebenen. Einfach "f.write" anstelle von Ausdrucken machen. Jedenfalls scheint dies mit der internen Pufferung zu tun zu haben (die von außerhalb des Codes manipuliert werden kann). Versuchen Sie nach jedem Schreiben 'f.flush()' Zeilen einzufügen. – freakish

+0

Ich leite beide stdout & stderr, die wie erwartet funktioniert. Ich habe bereits erwähnt, dass ich 'f.flush()' bereits verwendet habe, aber ich benutze f.close() nicht, da es die f.flush-Methode innerhalb von – Macbook

+2

anhöre. Sie spielen mit einem der wichtigsten Globals . Tu es einfach nicht. Nebenwirkungen sind kaum vorstellbar. Wie auch immer, ich kann Ihr Problem nicht reproduzieren. Wie überwachen Sie die Datei? – freakish

Antwort

0

Verwenden Sie den Debugger in Ihrer IDE. Setzen Sie beim ersten time.sleep() einen Haltepunkt und gehen Sie Zeile für Zeile durch, um das Problem genauer diagnostizieren zu können.

Verwandte Themen