web-dev-qa-db-fra.com

Flask APP - ValueError: le signal ne fonctionne que dans le thread principal

J'essaie de créer un simple flask app:

from flask import Flask

app = Flask(__name__)

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

mais quand j'ajoute le débogage:

FLASK_APP = run.py
FLASK_ENV = development
FLASK_DEBUG = 1

J'ai eu l'erreur suivante:

ValueError: le signal ne fonctionne que dans le thread principal

ici le stacktrace complet

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
12
Frennetix

Le problème que vous rencontrez est dû à un bogue dans le package Flask-SocketIO qui remplace le flask run commande. En raison de cela, Flask-SocketIO est toujours utilisé même si vous ne l'importez pas. Il y a plusieurs solutions:

  1. Désinstallez Flask-SocketIO
  2. Ne pas utiliser flask run mais lancez le fichier principal de votre programme
  3. Désactiver le débogage
  4. Désactiver le chargement automatique si le débogage est requis flask run --no-reload

Référence au bogue Flask-SocketIO: numéro 817

25
rfkortekaas

J'ai résolu le problème grâce à @ AkshayKumar007 réponse sur github. C'était la solution la plus pratique pour moi.

Hé les gars, je faisais également face au même problème. Donc, pour résumer, si vous utilisez socket-io, ne faites pas flask run. Premièrement, ajoutez

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

A la fin de votre candidature. Pour l'exécuter, il suffit de

python3 __init__.py

J'espère que ça a aidé.

1
snoob dogg