2015-11-12 1 views
9

Итак, я играл с библиотекой Tensorflow Google, которую они опубликовали вчера, и столкнулся с раздражающей ошибкой, которая продолжает кусать меня.Tensorflow вызывает двоичное сообщение сообщений

То, что я сделал, это настроить функции ведения журнала на python, как я обычно делаю, и результатом было то, что если я импортирую библиотеку tensorflow, все сообщения в консоли начнут удваиваться. Интересно, что это не произойдет, если вы просто используете функцию logging.warn/info/..().

Пример кода, который делает не двойные сообщения:

import tensorflow as tf 
import logging 

logging.warn('test') 

Пример кода, который делает двойные все сообщения:

import tensorflow as tf 
import logging 

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

logger.warn('test') 

Теперь я простой человек. Мне нравится функциональность logging, поэтому я использую ее. Настройка с объектом logger и добавлением StreamHandler - это то, что я поднял, глядя на то, как это делают другие люди, но похоже, что это соответствует тому, как должна была использоваться эта вещь. Тем не менее, у меня нет глубоких знаний о библиотеке регистрации, так как это всегда просто работало.

Таким образом, любая помощь, объясняющая, почему происходит удвоение сообщений, будет наиболее полезна.

Я использую Ubuntu 14.04.3 LTS с Python 2.7.6, но ошибка возникает во всех версиях Python 2.7, которые я пробовал.

+0

Я с трудом тиражирование это на Ubuntu 14.04 и с питоном 2.7.6: питон testlog.py ВНИМАНИЕ: корень: тест Можете ли вы предоставить более детальную информацию о том, как вы установили ТФ? – dga

+0

Ах! В вашем примере кода есть опечатка. Последняя строка должна быть logger.warn ('test') вместо logging.warn. Теперь я воспроизвел его. И ответ немного яснее - держитесь. – dga

ответ

12

я получаю этот выход:

test 
WARNING:TEST:test 

Tensorflow является также с использованием рамок протоколирования и настроил свои собственные обработчики, поэтому при входе в систему по умолчанию, она распространяется до обработчиков родительского лесозаготовительных внутри tensorflow. Вы можете изменить это поведение, установив:

logger.propagate = False 

Смотрите также duplicate output in simple python logging configuration

Followup: Это был непреднамеренный побочный эффект пути tensorflow использует пакет протоколирования. Я изменил его в HEAD, чтобы охватить его внутренние регистраторы под названием «тензорный поток», чтобы избежать этого загрязнения. Должно быть в голове github в течение дня или около того. В то же время решение logger.propagate будет работать и не будет ломаться после того, как будет установлено исправление, поэтому вы должны быть в безопасности. Еще раз спасибо за это!

+0

(Я собираюсь проверить, действительно ли это предназначено или ошибка - я никогда не сталкивался с этим или слишком много думал об этом.) – dga

+0

Спасибо за ваш ответ, он работал как ожидалось! – 5xum

+0

Tensorflow не использует пакет регистрации в стандартном способе выполнения getLogger (__ name__), поэтому вы видите это столкновение пространства имен. Я пошлю патч для этого и посмотрю, сможем ли мы сделать это счастливее. Спасибо, что спросили об этом! – dga

Смежные вопросы