quart icon indicating copy to clipboard operation
quart copied to clipboard

Hot reload not working when `app.py` has `+x` permissions

Open Dustella opened this issue 10 months ago • 2 comments

Hot reload not working when app.py has +x permissions.

To replicate, create app.py like this, run it in debug mode

from quart import Quart

app = Quart(__name__)


@app.route("/api")
async def json():
    return {"hello": "world"}

if __name__ == "__main__":
    app.run(debug=True)

and give this file +x permissions on Linux

chmod +x app.py

use python app.py to run the code. Saving the file will cause an error like this:

[2025-02-11 13:31:59 +0800] [10620] [INFO] Running on http://127.0.0.1:5000 (CTRL + C to quit)
Traceback (most recent call last):
  File "/home/user/Code/quart_example/./app.py", line 11, in <module>
    app.run(debug=True)
  File "/home/user/miniconda3/lib/python3.11/site-packages/quart/app.py", line 890, in run
    restart()
  File "/home/user/miniconda3/lib/python3.11/site-packages/quart/utils.py", line 170, in restart
    os.execv(executable, [executable] + args)
OSError: [Errno 8] Exec format error

But by running the code using quart run, hot reload will work fine.

Environment:

  • Python version: Python 3.11.11 (main, Dec 11 2024, 16:28:39) [GCC 11.2.0] on linux
  • Quart version: Quart 0.20.0

Dustella avatar Feb 11 '25 05:02 Dustella

After some digging, I found the error is from https://github.com/pallets/quart/blob/b5593ca4c8c657564cdf2d35c9f0298fce63636b/src/quart/utils.py#L156

why? I know we want to know whether I am ran via quart ... or python xxx.py, but it seems it doesn't even matter, just rerun the executable with args will do good. dealing with xxx.exe is a Windows specific problem, and there is no need to know how it is booted in linux.

Dustella avatar Feb 11 '25 05:02 Dustella

after some testing, altering https://github.com/pallets/quart/blob/b5593ca4c8c657564cdf2d35c9f0298fce63636b/src/quart/utils.py#L156

        else:
-            if script_path.is_file() and os.access(script_path, os.X_OK):
-                # hypercorn run:app --reload
-                executable = str(script_path)
-            else:
-                # python run.py
-                args = [str(script_path), *args]
+           args = [str(script_path), *args]

will resolve this issue on linux, hot reloading working both with quart run and python xxx.py. Please let me know if someone tested on Mac

Dustella avatar Feb 11 '25 05:02 Dustella