NodeJS使用Python-Shell.run无法获取Python脚本STDOUT输出求助
解决Node.js通过python-shell调用Python脚本时参数传递与输出获取的问题
嘿,我明白你现在的困扰了——用python-shell的时候,on和end方法能拿到Python的打印输出,但没法传参数;换成run方法能传参数,却拿不到本该返回的内容。其实问题出在你设置的mode: 'JSON'和Python输出格式不匹配上,我给你两种解决方案:
方案一:使用文本模式(简单场景首选)
你设置了mode: 'JSON',这时候python-shell会强制要求Python输出合法的JSON字符串,否则它没法解析,自然拿不到结果。如果只是传递简单字符串参数、获取普通打印输出,直接去掉JSON模式就行:
修改后的Node.js代码
var pythonShell = require('python-shell'); app.post('/index/generator/', urlencodedParser, function (req, res){ var options = { pythonOptions: ['-u'], // 这个参数很关键,关闭Python输出缓冲,确保实时获取内容 scriptPath: './generator', args: ['hello','bye'] }; pythonShell.run('generator.py', options, function (err, results) { if (err) throw err; // results是Python输出的每一行组成的数组,这里直接拼接成字符串 console.log("Message: ", results.join('')); }); })
Python代码无需修改
你的Python脚本已经正确读取参数并打印了,保持原样就行:
#!/usr/bin/python # -*- coding: utf-8 -*- import sys print(sys.argv[1]+' '+sys.argv[2])
方案二:使用JSON模式(适合复杂数据交互)
如果需要在Node.js和Python之间传递复杂数据(比如对象、数组),那可以继续用JSON模式,但要让Python输出合法的JSON字符串:
修改后的Python代码
#!/usr/bin/python # -*- coding: utf-8 -*- import sys import json # 构造JSON格式的输出内容 output_data = { 'combined_message': sys.argv[1] + ' ' + sys.argv[2] } # 打印JSON字符串(必须确保输出是合法JSON,不能有多余的打印内容) print(json.dumps(output_data))
Node.js代码保持JSON模式
var pythonShell = require('python-shell'); app.post('/index/generator/', urlencodedParser, function (req, res){ var options = { mode: 'JSON', pythonOptions: ['-u'], scriptPath: './generator', args: ['hello','bye'] }; pythonShell.run('generator.py', options, function (err, results) { if (err) throw err; // results[0]就是解析后的JSON对象 console.log("Message: ", results[0].combined_message); }); })
补充说明:pythonOptions: ['-u']一定要加上,它会关闭Python的输出缓冲,避免Node.js无法及时获取到Python的打印内容,尤其是在脚本输出较多的时候。
内容的提问来源于stack exchange,提问作者florian
相关产品推荐
相关产品推荐

