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
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:
flask run
mais lancez le fichier principal de votre programmeflask run --no-reload
Référence au bogue Flask-SocketIO: numéro 817
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é.