Python中如何调用Node.js并获取执行结果?

python 用 os.popen 调用 node 然后取结果


Python中如何调用Node.js并获取执行结果?
4 回复

用 execjs 啊


import subprocess
import json
import os

def run_node_script(script_path, args=None):
    """
    执行Node.js脚本并获取结果
    
    Args:
        script_path: Node.js脚本路径
        args: 传递给Node.js脚本的参数列表
    
    Returns:
        脚本执行结果(如果是JSON会自动解析为Python对象)
    """
    # 构建命令
    cmd = ['node', script_path]
    if args:
        cmd.extend(args)
    
    try:
        # 执行Node.js脚本
        result = subprocess.run(
            cmd,
            capture_output=True,
            text=True,
            check=True
        )
        
        # 尝试解析JSON输出
        try:
            return json.loads(result.stdout.strip())
        except json.JSONDecodeError:
            return result.stdout.strip()
            
    except subprocess.CalledProcessError as e:
        raise RuntimeError(f"Node.js执行失败: {e.stderr}")

# 示例:调用一个返回JSON的Node.js脚本
if __name__ == "__main__":
    # 创建示例Node.js脚本
    node_code = """
    // 示例Node.js脚本:计算斐波那契数列
    function fibonacci(n) {
        if (n <= 1) return n;
        return fibonacci(n - 1) + fibonacci(n - 2);
    }
    
    const num = process.argv[2] ? parseInt(process.argv[2]) : 10;
    const result = fibonacci(num);
    
    // 输出JSON格式结果
    console.log(JSON.stringify({
        input: num,
        fibonacci: result,
        message: `斐波那契数列第${num}项是${result}`
    }));
    """
    
    # 保存临时脚本文件
    with open('temp_fib.js', 'w', encoding='utf-8') as f:
        f.write(node_code)
    
    try:
        # 调用Node.js脚本并传递参数
        result = run_node_script('temp_fib.js', ['15'])
        print(f"Node.js返回结果: {result}")
        print(f"类型: {type(result)}")
        
    finally:
        # 清理临时文件
        if os.path.exists('temp_fib.js'):
            os.remove('temp_fib.js')

核心就这几步:用subprocess调用node命令,捕获输出,需要JSON就解析一下。记得处理异常和清理临时文件。

我说调用 nodejs 不是 js

直接用 execjs 执行 node 代码得出返回值便是,为什么要再去用 os 去调 node 命令行? 要是涉及到浏览器执行 js 就 pyppeteer 或者进一步封装的 requests_html 去执行 js 代码,也不需要用到你说的那种,如果我没理解错你的问题的话,感觉你现在选取的技术策略有那么一点问题

回到顶部