Flask APP - ValueError: signal only works in main thread

41,262

Solution 1

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:

  1. Uninstall Flask-SocketIO
  2. Do not use flask run but run the main file of your program
  3. Disable debugging
  4. Disable auto loading if debugging required flask run --no-reload

Reference to the Flask-SocketIO bug: issue 817

Solution 2

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.

Share:
41,262
Frennetix
Author by

Frennetix

Updated on August 20, 2020

Comments

  • Frennetix
    Frennetix over 3 years

    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:\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