仅在启用调试模式的情况下获取ModuleNotFoundError

时间:2020-04-24 08:17:32

标签: python tensorflow flask

我有一个Flask服务器,它在启动时会在外部服务模块中加载Tensorflow个模型。

问题在于是否启用了调试模式,因此FLASK_DEBUG = 1导致应用程序崩溃,因为它无法从Tensorflow加载特定模块。 tensorflow_core.keras

但是,无需调试即可运行应用程序。

项目结构如下:

controllers/
    __init__.py     # Exposes controllers_blueprint
    controller.py
services/
    service.py
__init__.py         # Exposes app, socketio
model_util.py       # Used to load models, imports Tensorflow
server.py

因此,在services/service.py中,在模块加载时,我调用一个完成该任务的函数:

import model_util

def _load_models():
    # Loading models here using model_util.load(..)
    return models


_models = _load_models()

此模块从controllers/controller.py

导入
from services import service
from flask import current_app, request
from application import socketio

NAMESPACE = '/test'

@socketio.on('connect', namespace=NAMESPACE)
def handle_connect():
    service.create_session(request.sid)

controllers/__init__.py暴露controller_blueprint的地方:

from flask import Blueprint
from controllers import controller

controllers_blueprint = Blueprint('controllers', __name__)

然后在我的server.py

中注册
from flask import current_app

from controllers import controllers_blueprint
from application import app, socketio

def main():
    app.register_blueprint(controllers_blueprint)
    socketio.run(app)


if __name__ == '__main__':
    main()

为完整起见,这是__init__.py

from flask import Flask
from flask_caching import Cache
from flask_socketio import SocketIO


HTTP_SERVER_PORT = 5000

app = Flask(__name__, static_folder='../static', static_url_path='')

cache = Cache(config={'CACHE_TYPE': 'simple'})
cache.init_app(app)

socketio = SocketIO(app)
socketio.init_app(app)

model_util.py是导入Tensorflow模块的地方:

import tensorflow as tf
from tensor2tensor.data_generators.text_encoder import SubwordTextEncoder
# ...

def load(...):
   # ..
   pass

我得到的错误是

Traceback (most recent call last):
  File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/site-packages/flask/__main__.py", line 15, in <module>
    main(as_module=True)
  File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/site-packages/flask/cli.py", line 967, in main
    cli.main(args=sys.argv[1:], prog_name="python -m flask" if as_module else None)
  File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/site-packages/flask/cli.py", line 586, in main
    return super(FlaskGroup, self).main(*args, **kwargs)
  File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/site-packages/click/core.py", line 782, in main
    rv = self.invoke(ctx)
  File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/site-packages/click/core.py", line 1259, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/site-packages/click/core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/site-packages/click/core.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/site-packages/click/decorators.py", line 73, in new_func
    return ctx.invoke(f, obj, *args, **kwargs)
  File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/site-packages/click/core.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/site-packages/flask/cli.py", line 860, in run_command
    extra_files=extra_files,
  File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/site-packages/werkzeug/serving.py", line 1050, in run_simple
    run_with_reloader(inner, extra_files, reloader_interval, reloader_type)
  File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/site-packages/werkzeug/_reloader.py", line 337, in run_with_reloader
    reloader.run()
  File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/site-packages/werkzeug/_reloader.py", line 202, in run
    for filename in chain(_iter_module_files(), self.extra_files):
  File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/site-packages/werkzeug/_reloader.py", line 24, in _iter_module_files
    filename = getattr(module, "__file__", None)
  File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/site-packages/tensorflow/__init__.py", line 50, in __getattr__
    module = self._load()
  File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/site-packages/tensorflow/__init__.py", line 44, in _load
    module = _importlib.import_module(self.__name__)
  File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 965, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'tensorflow_core.keras'

这是什么原因?如何解决此问题?

其他信息

我正在使用PyCharm运行该应用程序。这是启动时的输出:

FLASK_APP = application/server.py
FLASK_ENV = development
FLASK_DEBUG = 1
In folder /Users/sfalk/workspaces/git/web-service
/Users/sfalk/miniconda3/envs/web-service/bin/python -m flask run
 * Serving Flask app "application/server.py" (lazy loading)
 * Environment: development
 * Debug mode: on
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 298-908-268

1 个答案:

答案 0 :(得分:0)

显然,werkzeug中有一个bugflask使用flaskflask调试模式下运行python -m应用时为-m应用提供服务1}}。

为防止这种情况发生,您可以在不使用flask run选项的情况下启动应用程序,例如使用restclient