Flask调用os.system启动程序后页面需等程序关闭才加载如何解决
问题根因
os.system()本身是同步阻塞调用,执行后会一直等待启动的子进程(示例中的记事本)运行结束、退出后才会返回执行结果,你的视图函数卡在这一步没执行完,自然没法给前端返回响应,就会出现页面一直加载的情况。
解决方法
改用 subprocess.Popen 启动程序,这个方法是异步非阻塞的,启动子进程后会直接往下执行,不会等待子进程退出。
修改后的代码如下:
import subprocess from flask import Flask app = Flask(__name__) @app.route("/") def hello_world(): # 替换os.system为subprocess.Popen即可实现非阻塞启动 subprocess.Popen("notepad", shell=True) return "<p>Hello, World!<br>Launching Notepad!</p>" if __name__ == '__main__': # 要实现手机访问,需将host设为0.0.0.0,保证同一局域网下设备可访问 app.run(host="0.0.0.0", debug=True)
额外注意事项
- 如果启动的是带空格路径的程序,比如
C:\Program Files\Tencent\QQ\Bin\QQ.exe,可以直接传列表参数:subprocess.Popen([r"C:\Program Files\Tencent\QQ\Bin\QQ.exe"]) - 手机访问前需要关闭PC的防火墙,或者开放Flask默认运行的5000端口,同时保证手机和PC在同一局域网下
- 生产环境部署时不要开启debug模式,测试阶段可正常使用
内容的提问来源于stack exchange,提问作者Zariaa_
相关产品推荐
相关产品推荐

