You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 16:06:27