Приложение Flask - ValueError: сигнал работает только в основном потоке - программирование

Приложение Flask - ValueError: сигнал работает только в основном потоке

Я пытаюсь создать простое приложение для колб:

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
4b9b3361

Ответ 1

Проблема, с которой вы сталкиваетесь, связана с ошибкой в пакете Flask-SocketIO, которая заменяет команду flask run флэш-памяти. Благодаря этому Flask-SocketIO всегда используется, даже если вы его не импортируете. Есть несколько решений:

  1. Удалить Flask-SocketIO
  2. Не используйте flask run но запустите основной файл вашей программы
  3. Отключить отладку
  4. Отключить автоматическую загрузку, если требуется отладка, flask run --no-reload

Ссылка на ошибку Flask-SocketIO: выпуск 817

Ответ 2

Я решил проблему благодаря ответу @AkshayKumar007 answer на github. Это было самое удобное для меня решение.

Эй, ребята, я тоже столкнулся с той же проблемой. Итак, подведем итог, если вы используете сокет-IO, не делайте фляги. Сначала добавьте

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

В конце вашего заявления. Для запуска просто сделайте

python3 __init__.py

Надеюсь, это помогло.