如何将Python的vmonoff数组传递至Express.js?解决引用错误
如何将Python中的vmonoff数组传递给Express.js
你遇到的ReferenceError: response is not defined是因为Python和Express.js运行在独立进程中,无法直接共享内存变量。要传递数据,需要通过进程间通信或者HTTP接口两种方式实现,以下是具体方案:
方案一:通过子进程执行Python脚本并读取标准输出
步骤1:修改Python脚本,输出JSON数据
在你的vmstats.py末尾添加print(response),将JSON字符串输出到标准输出,让Express可以捕获这个输出:
import json from proxys import ProxyServer vmonoff = [] proxys = ProxyServer('XXXXXX','UUUUUU','PPPPPP') for b in proxys.listeners: if "MYVMNAME" in b.vname: if b.stat=="UP": vmonoff.append('./images/vm_on.png') else: vmonoff.append('./images/vm_off.png') print('{:<10}'.format(b.vname), '{:<8}'.format('Status:'), '{:>6}'.format(b.stat)) response = json.dumps(vmonoff) print(response) # 新增:将JSON输出到标准输出
步骤2:在Express.js中调用Python脚本并解析输出
使用Node.js的child_process模块执行Python脚本,捕获标准输出后解析为JSON:
const { exec } = require('child_process'); // 在你的exec.controller.js中添加以下逻辑 function fetchVMStatus() { exec('python3 vmstats.py', (error, stdout, stderr) => { if (error) { console.error(`执行Python脚本失败: ${error.message}`); return; } if (stderr) { console.error(`Python脚本错误输出: ${stderr}`); return; } try { // 去除输出中的换行符后解析JSON const responseObject = JSON.parse(stdout.trim()); console.log('获取到VM状态数组:', responseObject); // 这里可以添加你的业务逻辑,比如返回给前端 } catch (parseError) { console.error('JSON解析失败:', parseError.message); } }); } // 调用函数获取数据 fetchVMStatus();
方案二:将Python脚本封装为HTTP接口,Express发起请求
如果需要更灵活的跨进程/跨机器通信,可以把Python脚本做成HTTP服务,Express通过HTTP请求获取数据。
步骤1:用Flask搭建Python HTTP服务
首先安装Flask:pip install flask,然后修改脚本为接口形式:
from flask import Flask, jsonify from proxys import ProxyServer app = Flask(__name__) @app.route('/api/vm-status', methods=['GET']) def get_vm_status(): vmonoff = [] proxys = ProxyServer('XXXXXX','UUUUUU','PPPPPP') for b in proxys.listeners: if "MYVMNAME" in b.vname: vmonoff.append('./images/vm_on.png' if b.stat == "UP" else './images/vm_off.png') print('{:<10}'.format(b.vname), '{:<8}'.format('Status:'), '{:>6}'.format(b.stat)) return jsonify(vmonoff) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=True) # 启动服务,端口可自定义
步骤2:在Express.js中请求Python接口
使用axios发起HTTP请求,先安装依赖:npm install axios,然后编写代码:
const axios = require('axios'); async function fetchVMStatus() { try { const response = await axios.get('http://localhost:5000/api/vm-status'); const responseObject = response.data; console.log('获取到VM状态数组:', responseObject); // 后续业务逻辑处理 } catch (error) { console.error('请求Python接口失败:', error.message); } } // 调用函数 fetchVMStatus();
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

