Flask APP – ValueError: signal only works in main thread
Question:
I try to create a simple flask app:
from flask import Flask
app = Flask(__name__)
if __name__ == '__main__':
app.run()
but when I add the debug:
FLASK_APP = run.py
FLASK_ENV = development
FLASK_DEBUG = 1
I got the following error:
ValueError: signal only works in main thread
here the full stacktrace
FLASK_APP = run.py
FLASK_ENV = development
FLASK_DEBUG = 1
In folder c:/MyProjectPath/api
c:MyProjectPathapivenvScriptspython.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:appdatalocalprogramspythonpython37Libthreading.py", line 917, in _bootstrap_inner
self.run()
File "c:appdatalocalprogramspythonpython37Libthreading.py", line 865, in run
self._target(*self._args, **self._kwargs)
File "c:MyProjectPathapivenvlibsite-packagesflask_socketiocli.py", line 59, in run_server
return run_command()
File "c:MyProjectPathapivenvlibsite-packagesclickcore.py", line 764, in __call__
return self.main(*args, **kwargs)
File "c:MyProjectPathapivenvlibsite-packagesclickcore.py", line 717, in main
rv = self.invoke(ctx)
File "c:MyProjectPathapivenvlibsite-packagesclickcore.py", line 956, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "c:MyProjectPathapivenvlibsite-packagesclickcore.py", line 555, in invoke
return callback(*args, **kwargs)
File "c:MyProjectPathapivenvlibsite-packagesclickdecorators.py", line 64, in new_func
return ctx.invoke(f, obj, *args, **kwargs)
File "c:MyProjectPathapivenvlibsite-packagesclickcore.py", line 555, in invoke
return callback(*args, **kwargs)
File "c:MyProjectPathapivenvlibsite-packagesflaskcli.py", line 771, in run_command
threaded=with_threads, ssl_context=cert)
File "c:MyProjectPathapivenvlibsite-packageswerkzeugserving.py", line 812, in run_simple
reloader_type)
File "c:MyProjectPathapivenvlibsite-packageswerkzeug_reloader.py", line 267, in run_with_reloader
signal.signal(signal.SIGTERM, lambda *args: sys.exit(0))
File "c:appdatalocalprogramspythonpython37Libsignal.py", line 47, in signal
handler = _signal.signal(_enum_to_int(signalnum), _enum_to_int(handler))
ValueError: signal only works in main thread
Answers:
The problem you are facing has to do with a bug in the Flask-SocketIO package which replaces the flask run
command. Due to this Flask-SocketIO is always used even if you don’t import it. There are several solutions:
- Uninstall Flask-SocketIO
- Do not use
flask run
but run the main file of your program
- Disable debugging
- Disable auto loading if debugging required
flask run --no-reload
Reference to the Flask-SocketIO bug: issue 817
I solved the problem thanks to @AkshayKumar007 answer on github. That was the most convenient solution for me.
Hey guys, I was also facing the same problem. So to summarize, if
you’re using socket-io, don’t do flask run. First, add
if __name__ == "__main__":
socketio.run(app)
At the end of your application. To run it just do
python3 __init__.py
Hope it helped.
I try to create a simple flask app:
from flask import Flask
app = Flask(__name__)
if __name__ == '__main__':
app.run()
but when I add the debug:
FLASK_APP = run.py
FLASK_ENV = development
FLASK_DEBUG = 1
I got the following error:
ValueError: signal only works in main thread
here the full stacktrace
FLASK_APP = run.py
FLASK_ENV = development
FLASK_DEBUG = 1
In folder c:/MyProjectPath/api
c:MyProjectPathapivenvScriptspython.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:appdatalocalprogramspythonpython37Libthreading.py", line 917, in _bootstrap_inner
self.run()
File "c:appdatalocalprogramspythonpython37Libthreading.py", line 865, in run
self._target(*self._args, **self._kwargs)
File "c:MyProjectPathapivenvlibsite-packagesflask_socketiocli.py", line 59, in run_server
return run_command()
File "c:MyProjectPathapivenvlibsite-packagesclickcore.py", line 764, in __call__
return self.main(*args, **kwargs)
File "c:MyProjectPathapivenvlibsite-packagesclickcore.py", line 717, in main
rv = self.invoke(ctx)
File "c:MyProjectPathapivenvlibsite-packagesclickcore.py", line 956, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "c:MyProjectPathapivenvlibsite-packagesclickcore.py", line 555, in invoke
return callback(*args, **kwargs)
File "c:MyProjectPathapivenvlibsite-packagesclickdecorators.py", line 64, in new_func
return ctx.invoke(f, obj, *args, **kwargs)
File "c:MyProjectPathapivenvlibsite-packagesclickcore.py", line 555, in invoke
return callback(*args, **kwargs)
File "c:MyProjectPathapivenvlibsite-packagesflaskcli.py", line 771, in run_command
threaded=with_threads, ssl_context=cert)
File "c:MyProjectPathapivenvlibsite-packageswerkzeugserving.py", line 812, in run_simple
reloader_type)
File "c:MyProjectPathapivenvlibsite-packageswerkzeug_reloader.py", line 267, in run_with_reloader
signal.signal(signal.SIGTERM, lambda *args: sys.exit(0))
File "c:appdatalocalprogramspythonpython37Libsignal.py", line 47, in signal
handler = _signal.signal(_enum_to_int(signalnum), _enum_to_int(handler))
ValueError: signal only works in main thread
The problem you are facing has to do with a bug in the Flask-SocketIO package which replaces the flask run
command. Due to this Flask-SocketIO is always used even if you don’t import it. There are several solutions:
- Uninstall Flask-SocketIO
- Do not use
flask run
but run the main file of your program - Disable debugging
- Disable auto loading if debugging required
flask run --no-reload
Reference to the Flask-SocketIO bug: issue 817
I solved the problem thanks to @AkshayKumar007 answer on github. That was the most convenient solution for me.
Hey guys, I was also facing the same problem. So to summarize, if
you’re using socket-io, don’t do flask run. First, addif __name__ == "__main__": socketio.run(app)
At the end of your application. To run it just do
python3 __init__.py
Hope it helped.