Keras принудительно выводит на sys.stderr
(для которого исправление было отклонено на GitHub ).Кажется, существует проблема записи в системные выходные данные дочернего процесса в веб-приложении.Это приводит к тому, что мой код выдает соответствующую ошибку при попытке сообщить о реализации бэкэнда при импорте Keras
.
AttributeError: 'NoneType' object has no attribute 'write'
Я пытался перенаправить вывод на os.devnull
в соответствии с этим ответом до создания экземпляра приложения Flask и запуска его с web.config
.Однако ошибка сохранилась.Любопытно, что запись без multiprocessing
работала просто отлично.
import sys
from flask import Flask
import keras
app = Flask(__name__)
@app.route('/')
def main():
print('Hello!')
sys.stdout.write('test\n')
sys.stderr.write('emsg\n')
return 'OK.', 200
Даже from keras import backend as k
работает.Это утверждение, которое изначально произвело ошибку.Это оставило меня в замешательстве. В чем может быть дело?
Минимальный пример
В моем приложении для процессов обучения создается подпроцесс.При попытке записать вывод в multiprocessing.Process
выдается ошибка.Вот некоторый код для воспроизведения ситуации.
import sys
from flask import Flask
from multiprocessing import Process
def write_output():
sys.stdout.write('hello\n')
def create_app():
apl = Flask(__name__)
Process(target=write_output).start()
@apl.route('/')
def main():
return 'OK.', 200
return apl
Это приложение затем создается в другом файле и вызывается из web.config
.Базовое ведение журнала подтвердило, что ошибка все еще генерируется.
Почти исправление
Хотя это и не исправление, система работала с использованием threading
.Простое переключение multiprocessing.Queue and Process
на queue.Queue
и threading.Thread
не приводит к возникновению ошибок, подобных описанным выше.Для моего варианта использования это приемлемо на данный момент.Конечно, это не решение проблемы записи вывода в дочернем процессе.