Flask 运行 Python 进程并实时获取输出结果

本文将介绍如何使用 Flask 框架运行 Python 进程,并通过实时获取输出结果来实现交互式控制。我们将使用 subprocess 库来执行 ping 命令,并使用 Flask 的路由和请求处理机制来控制进程的启动和停止。

代码示例

import subprocess
from flask import Flask, render_template, request, jsonify, make_response, redirect

app = Flask(__name__)
process = None

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/execute', methods=['POST'])
def execute():
    global process
    if request.form['action'] == 'start':
        if process is not None and process.poll() is None:
            # 如果进程正在运行,则不执行新的命令
            return jsonify({'output': '进程正在运行,请先停止'})
        process = subprocess.Popen(['ping', '1.1.1.1'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        return jsonify({'output': '进程已启动'})  # 这里返回'进程已启动',表示进程已经成功启动,而不是等待进程执行完毕后再返回结果
    elif request.form['action'] == 'stop':
        if process is not None and process.poll() is None:
            # 如果进程正在运行,则停止进程
            process.terminate()
            process.wait()
            process = None
        return jsonify({'output': '进程已停止'})
    else:
        return make_response(jsonify({'error': '无效的动作'}), 400)

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

代码解释

  1. 使用 subprocess.Popen 创建一个新的进程,并指定 stdoutstderr 参数,以便获取进程的输出和错误信息。
  2. execute 函数中,根据 action 参数的值,执行不同的操作:
    • 如果 actionstart,则启动 ping 进程,并返回 '进程已启动' 的信息。
    • 如果 actionstop,则终止进程,并返回 '进程已停止' 的信息。
  3. 使用 jsonify 函数将数据转换为 JSON 格式,并返回给前端。

注意

  • execute 函数中,将 output, error = process.communicate() 这行代码删除,因为 communicate() 会等待进程执行完毕后再返回结果,这样会导致前端无法实时获取输出结果。
  • 可以通过 process.stdout.readline()process.stderr.readline() 方法实时读取进程的输出和错误信息,并通过 jsonify 函数将信息返回给前端。

示例

前端代码可以使用 AJAX 或 WebSocket 等技术,向 Flask 服务器发送请求,并接收进程的输出结果。

// 示例:使用 AJAX 获取进程输出结果
$.ajax({
    url: '/execute',
    type: 'POST',
    data: {action: 'start'},
    success: function(data) {
        console.log(data.output); // 打印进程启动的信息
    }
});

总结

本文介绍了如何使用 Flask 框架运行 Python 进程,并通过实时获取输出结果来实现交互式控制。这种方法可以用于各种场景,例如:

  • 实时监控系统状态
  • 收集日志信息
  • 执行长时间运行的脚本

希望本文对您有所帮助!

Flask 运行 Python 进程并实时获取输出结果

原文地址: https://www.cveoy.top/t/topic/qytE 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录