Flask 运行 Python 进程并实时获取输出结果
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)
代码解释
- 使用
subprocess.Popen创建一个新的进程,并指定stdout和stderr参数,以便获取进程的输出和错误信息。 - 在
execute函数中,根据action参数的值,执行不同的操作:- 如果
action为start,则启动ping进程,并返回'进程已启动'的信息。 - 如果
action为stop,则终止进程,并返回'进程已停止'的信息。
- 如果
- 使用
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 进程,并通过实时获取输出结果来实现交互式控制。这种方法可以用于各种场景,例如:
- 实时监控系统状态
- 收集日志信息
- 执行长时间运行的脚本
希望本文对您有所帮助!
原文地址: https://www.cveoy.top/t/topic/qytE 著作权归作者所有。请勿转载和采集!