Tensorflow регистрирует в stderr и приводит к сбою подпроцесса - PullRequest
0 голосов
/ 09 октября 2019

Я использую Tensorflow и Keras. У меня есть скрипт Python для запуска процесса прогнозирования, и мне нужно запустить его в подпроцессе, поэтому я делаю это так:

from subprocess import Popen, PIPE, TimeoutExpired
process = Popen(['python', 'start_prediction.py'], stdout=PIPE, stderr=PIPE)
try:
    output, errors = process.communicate(timeout=60)
except TimeoutExpired:
    process.kill()
    output, errors = process.communicate()

У меня есть регистратор, настроенный для моего приложения, и он работает нормально, ноесть также регистратор, используемый Tensorflow, и это то, с чем у меня проблема.

Мой регистратор настроен для использования StreamHandler с sys.stdout и FileHandler. Когда я распечатываю output и errors, все мои сообщения журнала сохраняются в output, в errors ничего нет. И это то, что я хочу.

С другой стороны, регистратор, используемый Tensorflow, не работает так, как мне нужно. Некоторые сообщения регистрируются в output (например, процесс прогнозирования и некоторые предупреждения), а некоторые из них регистрируются в потоке errors (другие предупреждения). Я не могу сказать, если приложение не удалось или нет, потому что, даже если оно работало и завершилось без ошибок, я все еще получаю сообщения в потоке errors.

Я пытался перенаправить всесообщения от Tensorflow к sys.stdout делают это:

from absl import logging
logging._warn_preinit_stderr = 0

и

import logging
import sys
from tensorflow.python.platform import tf_logging
tf_logging.get_logger().handlers = [logging.StreamHandler(sys.stdout)]

, но это не помогает (logging импорт находится в разных файлах, вот упрощенныйверсия). На самом деле, это не имеет никакого значения, по крайней мере, я не видел.

Теоретически, я получаю только предупреждения, поэтому я мог подавлять все предупреждающие сообщения и сохранять только ошибки, но я бы предпочел не делатьэто. Должен быть лучший способ справиться с этим.

Есть ли способ перенаправить весь вывод Tensorflow в поток sys.stdout? Или, может быть, есть другой способ не отображать никаких сообщений об ошибках в выводе errors?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...