Flask APP - ValueError:信号仅在主线程中有效

Posted

技术标签:

【中文标题】Flask APP - ValueError:信号仅在主线程中有效【英文标题】:Flask APP - ValueError: signal only works in main thread 【发布时间】:2019-04-30 12:21:13 【问题描述】:

我尝试创建一个简单的烧瓶应用程序:

from flask import Flask

app = Flask(__name__)

if __name__ == '__main__':
  app.run()

但是当我添加调试时:

FLASK_APP = run.py
FLASK_ENV = development
FLASK_DEBUG = 1

我收到以下错误:

ValueError:信号仅在主线程中起作用

这里是完整的堆栈跟踪

FLASK_APP = run.py
FLASK_ENV = development
FLASK_DEBUG = 1
In folder c:/MyProjectPath/api
c:\MyProjectPath\api\venv\Scripts\python.exe -m flask run
 * Serving Flask-SocketIO app "run.py"
 * Forcing debug mode on
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 283-122-745
Exception in thread Thread-1:
Traceback (most recent call last):
  File "c:\appdata\local\programs\python\python37\Lib\threading.py", line 917, in _bootstrap_inner
    self.run()
  File "c:\appdata\local\programs\python\python37\Lib\threading.py", line 865, in run
    self._target(*self._args, **self._kwargs)
  File "c:\MyProjectPath\api\venv\lib\site-packages\flask_socketio\cli.py", line 59, in run_server
    return run_command()
  File "c:\MyProjectPath\api\venv\lib\site-packages\click\core.py", line 764, in __call__
    return self.main(*args, **kwargs)
  File "c:\MyProjectPath\api\venv\lib\site-packages\click\core.py", line 717, in main
    rv = self.invoke(ctx)
  File "c:\MyProjectPath\api\venv\lib\site-packages\click\core.py", line 956, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "c:\MyProjectPath\api\venv\lib\site-packages\click\core.py", line 555, in invoke
    return callback(*args, **kwargs)
  File "c:\MyProjectPath\api\venv\lib\site-packages\click\decorators.py", line 64, in new_func
    return ctx.invoke(f, obj, *args, **kwargs)
  File "c:\MyProjectPath\api\venv\lib\site-packages\click\core.py", line 555, in invoke
    return callback(*args, **kwargs)
  File "c:\MyProjectPath\api\venv\lib\site-packages\flask\cli.py", line 771, in run_command
    threaded=with_threads, ssl_context=cert)
  File "c:\MyProjectPath\api\venv\lib\site-packages\werkzeug\serving.py", line 812, in run_simple
    reloader_type)
  File "c:\MyProjectPath\api\venv\lib\site-packages\werkzeug\_reloader.py", line 267, in run_with_reloader
    signal.signal(signal.SIGTERM, lambda *args: sys.exit(0))
  File "c:\appdata\local\programs\python\python37\Lib\signal.py", line 47, in signal
    handler = _signal.signal(_enum_to_int(signalnum), _enum_to_int(handler))
ValueError: signal only works in main thread

【问题讨论】:

我来到这里试图在 Django 代码中设置断点。有doesn't work的地方。还有一些解决方法的想法。 【参考方案1】:

感谢 github 上的 @AkshayKumar007 answer,我解决了这个问题。这对我来说是最方便的解决方案。

大家好,我也遇到了同样的问题。所以总结一下,如果 你正在使用socket-io,不要做烧瓶运行。首先,添加

if __name__ == "__main__":
    socketio.run(app)

在您的申请结束时。运行它就行了

python3 __init__.py

希望对您有所帮助。

【讨论】:

【参考方案2】:

您面临的问题与 Flask-SocketIO 包中的一个错误有关,该包替换了 flask run 命令。因此,即使您不导入 Flask-SocketIO,也会始终使用它。有几种解决方案:

    卸载 Flask-SocketIO 不要使用flask run,而是运行程序的主文件 禁用调试 如果需要调试,禁用自动加载flask run --no-reload

参考 Flask-SocketIO 错误:issue 817

【讨论】:

我将我的配置更改为直接在我的 IDE 中使用 python 并且它可以工作,你在验证 Flask-SocketIO 正在替换我的运行之后是正确的,谢谢。 @Frennetix - 将配置更改为直接使用 python?我可以知道你具体做了什么吗?就像终端中的 python 一样? @RajeshMappu 奇怪的是我只是“python.exe run.py” 我有同样的问题,但没有安装 Flask-SocketIO @SonicSoul 你可以通过运行程序的主文件而不是'flask run'来解决这个问题

以上是关于Flask APP - ValueError:信号仅在主线程中有效的主要内容,如果未能解决你的问题,请参考以下文章

flask框架----信号

84flask之信号和mateclass元类

Flask 第六篇Flask实例化参数以及信号

如何为flask-socketio解决ValueError('Invalid async_mode specified')?

flask实例化参数以及信号

使用Flask创建注册表单 - AttributeError:'ValueError'对象没有属性'name'