2015-11-12 8 views
9

So spielte ich mit Google Tensorflow Bibliothek sie gestern veröffentlicht und stieß auf einen nervigen Bug, der mich beißt.Tensorflow verursacht Logging Nachrichten zu verdoppeln

Was ich getan habe, war die Python Logging-Funktionen wie ich normalerweise tun, und das Ergebnis war, dass, wenn ich die Tensorflow-Bibliothek zu importieren, alle Nachrichten in der Konsole zu verdoppeln begann. Interessanterweise geschieht dies nicht passieren, wenn Sie nur die logging.warn/info/..() Funktion verwenden.

Ein Beispiel für einen Code, der nicht doppelte Meldungen tut:

import tensorflow as tf 
import logging 

logging.warn('test') 

Ein Beispiel für einen Code, dass tut Doppel alle Nachrichten:

import tensorflow as tf 
import logging 

logger = logging.getLogger('TEST') 
ch = logging.StreamHandler() 
logger.addHandler(ch) 

logger.warn('test') 

Nun, ich bin ein einfacher Mann. Ich mag die Funktionalität von logging, also benutze ich es. Das Setup mit dem logger Objekt und dem Hinzufügen eines StreamHandler ist etwas, was ich mir angeschaut habe, wie andere Leute das gemacht haben, aber es sieht so aus, als ob es damit paßt, wie das Ding benutzt werden sollte. Ich habe jedoch keine gründliche Kenntnis der Logging-Bibliothek, da es immer irgendwie funktioniert hat.

Also, jede Hilfe zu erklären, warum die Verdoppelung der Nachrichten auftritt, wird am hilfreichsten sein.

Ich benutze Ubuntu 14.04.3 LTS mit Python 2.7.6, aber der Fehler passiert in allen Python 2.7-Versionen, die ich ausprobiert habe.

+0

Ich habe eine harte Zeit, diese auf Ubuntu 14.04 auch mit Python 2.7.6 replizieren: Python testlog.py ACHTUNG: root: Test tf Können Sie etwas genauer darüber, wie Sie installiert? – dga

+0

Ah! In Ihrem Beispielcode ist ein Tippfehler enthalten. Die letzte Zeile sollte logger.warn ('test') statt logging.warn sein. Jetzt habe ich es repliziert. Und die Antwort ist ein bisschen klarer - Moment mal. – dga

Antwort

12

ich diese Ausgabe:

test 
WARNING:TEST:test 

Tensorflow ist auch die Logging-Framework und hat seine eigenen Handler einrichten, so, wenn Sie sich in der Standardeinstellung pflanzt es in den übergeordneten Protokollhandler nach oben Tensorfluss. Sie können dieses Verhalten, indem Sie ändern:

logger.propagate = False 

Siehe duplicate output in simple python logging configuration

Followup auch: Das war eine unbeabsichtigte Nebenwirkung der Art und Weise tensorflow wurde das Logging-Paket. Ich habe es bei HEAD geändert, um seine internen Logger unter dem Namen "Tensorflow" zu erfassen, um diese Verschmutzung zu vermeiden. Sollte innerhalb eines Tages oder so im Github sein. In der Zwischenzeit wird die logger.propagate-Lösung funktionieren und wird nicht brechen, sobald das Update in ist, so dass Sie sicher gehen sollten. Nochmals vielen Dank, dass Sie das bemerkt haben!

+0

(Ich werde prüfen, ob das tatsächlich beabsichtigt ist oder ein Bug - ich habe es noch nie gesehen oder zu viel darüber nachgedacht.) – dga

+0

Vielen Dank für Ihre Antwort, es hat wie erwartet funktioniert! – 5xum

+0

Tensorflow verwendet das Protokollierungspaket nicht standardmäßig in der Ausführung von getLogger (__ name__), weshalb die Namespace-Kollision auftritt. Ich werde einen Patch dafür schicken und sehen, ob wir es glücklicher machen können. Danke, dass du dich danach erkundigt hast! – dga

Verwandte Themen