2017-11-07 6 views
0

Ich stochle mit einem Problem mit Python. Ich habe Python 2.7.13 und Python 3.6.0 auf Red Hat Enterprise Linux Server Version 7.1 (Maipo) verwendet. Um die Ausgabe der Prozesse zu überwachen, möchte ich tail -f verwenden, um live in STDOUT und STDERR zu schauen. Das Schlüsselwort ist hier ungepufferte Ausgabe. Viele Vorschläge im Internet sagen Verwendung python -u ... oder die Umgebungsvariable PYTHONUNBUFFERED wie PYTHONUNBUFFERED=1 python ... oder stdbuf -e0 -o0 python .... Nichtsdestotrotz wappnet sich nichts für das folgende Testskript.Python arbeitet nicht im ungepufferten Modus

import sys 
import time 
while(True): 
    print("Test String") 
    time.sleep(1); 

Für alle verschiedenen Befehle habe ich immer gepufferte Ausgabe. Auch wenn ich STDERR benutzen möchte. Es ist immer noch gepuffert, was mich wirklich verwirrt, weil STDERR standardmäßig ungepuffert sein sollte. Die Verwendung von sys.stdout.flush() oder sys.stderr.flush() funktioniert auch nicht. Bei Verwendung von flush=True innerhalb print() funktioniert es wie vorgesehen.

Ich bin auf der Suche nach einer Lösung, die es nicht notwendig macht, Code zu bearbeiten, weil ich nicht alle Programme bearbeiten kann, um ungepufferte und sofort ausgespuckte Ausgabe zu erhalten. Wie kann ich das erreichen?

Wir freuen uns auf Ihre Antworten!

Beste Wünsche!

+0

Was erwarten Sie Ihr Testskript tut? –

+0

Sie können die Funktion 'print (flush = True)' außer Kraft setzen. –

+1

So hat mein ursprüngliches Skript einige Ergebnisse von Deep Learning und neuronalen Netzwerkschritten, die ich überwachen möchte. In meinem Testskript habe ich es auf eine Dummy-Ausgabe beschränkt, um zu sehen, ob die Ausgabe ungepuffert ist. @ElisByberi dafür muss ich Code bearbeiten. Einige Programme sind so riesig, dass es in einem Durcheinander enden würde, um alles zu bearbeiten. Ich suche nach etwas 'python -u' oder' PYTHONUNBUFFERED' anstatt dass sie arbeiten .. Ich weiß nicht einmal warum sie sind funktioniert nicht wie angekündigt. – TheOrangeman

Antwort

2

Sie können print() Funktion in Python 3 überschreiben. Auf diese Weise müssen Sie nicht jede print() Funktion in Ihren Skripts ändern.

import builtins 


def print(*args): 
    builtins.print(*args, sep=' ', end='\n', file=None, flush=True) 


print(
    'hello', 'world', 
    'I have overrode print() function!', 
    1, # integer 
    [1, 2], # list 
    {1, 2}, # set 
    (1, 2), # tuple 
    {1: 2} # dict 
) 

druckt:

hello world I have overrode print() function! 1 [1, 2] {1, 2} (1, 2) {1: 2} 
+0

Danke für Ihren Vorschlag. Leider ist die Ausgabe '('Test String',)'. Ich würde am glücklichsten sein, wenn 'python -u' oder' PYTHONUNBUFFERED' funktionieren würde, wie in der Werbung angegeben. Weißt du, ob ich etwas in Bezug auf Optionen verpasst habe? – TheOrangeman

+1

@TheOrangeman Um ehrlich zu sein, habe ich den Code nicht getestet. Ich gebe es nur als Beispiel an. Es funktioniert jetzt wie erwartet. Danke, dass du es gemeldet hast. –

+0

@TheOrangeman Versuchen Sie diesen Befehl: 'python -e PYTHONUNBUFFERED = 0 yourscript.py' –

Verwandte Themen