我有一个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
答案 0 :(得分:0)
显然,werkzeug
中有一个bug,flask
使用flask
在flask
调试模式下运行python -m
应用时为-m
应用提供服务1}}。
为防止这种情况发生,您可以在不使用flask run
选项的情况下启动应用程序,例如使用restclient
。