无法从处理 python 脚本的 nodejs 项目中的 JavaScript 函数中 return json 对象?
Cannot return json object from a JavaScript function in a nodejs project that deals with a python script?
我认为发生了一些我无法弄清楚的异步事情
如果可能的话,请告诉我如何用 async-await
解决这个问题。
我的代码:
const {spawn} = require('child_process')
const getWeatherReport = (location) => {
let dataToSend, result
const python = spawn('python', [__dirname+'\weathergetter.py', location.toString()])
python.stdout.on('data', (data) => {
console.log('Pipe data from python script ...');
dataToSend = JSON.parse(data.toString().replace(/\'/g, '\"'));
// console.log(dataToSend)
})
python.stderr.on('data', data => {
console.error(`stderr: ${data}`)
})
python.on('close', (code) => {
console.log(`child process close all stdio with code ${code}`);
// console.log(dataToSend)
})
return dataToSend
}
var wea = getWeatherReport("kolkata")
console.log(wea)
Output:
undefined
Pipe data from python script ...
child process close all stdio with code 0
我希望函数 return 分配给 dataToSend
的 json object
。在这里,我实际上是在使用 python 脚本。
python脚本没有问题。当我在 python.stdout.on()
和 python.on()
中 console.log(dataToSend)
作为 在代码 中注释掉时,json 对象被打印到控制台。但是我不能使函数return成为json对象。
我关注的内容请参考这些:
- 主要是这个 -- https://medium.com/swlh/run-python-script-from-node-js-and-send-data-to-browser-15677fcf199f
- https://www.sohamkamani.com/blog/2015/08/21/python-nodejs-comm/
- https://towardsdatascience.com/python-pandas-in-node-js-application-47a76ae42a2a
注意:请不要像对我上一个问题所做的那样将此问题标记为重复。我可以理解堆栈溢出中已经有很多关于这个主题的post。但这对我的情况没有帮助。
我之前的 post 被关闭后我尝试了什么:
const {spawn} = require('child_process')
const getWeatherReport = async (location) => {
let dataToSend
const python = spawn('python', [__dirname+'\weathergetter.py', location.toString()])
python.stdout.on('data', async (data) => {
console.log('Pipe data from python script ...');
dataToSend = JSON.parse(data.toString().replace(/\'/g, '\"'));
// console.log(dataToSend)
})
python.stderr.on('data', data => {
console.error(`stderr: ${data}`)
})
python.on('close', (code) => {
console.log(`child process close all stdio with code ${code}`);
// console.log(dataToSend)
})
return await dataToSend
}
var wea = await getWeatherReport("kolkata")
console.log(`data: ${ await wea}`)
由于您没有使用 async/await 或回调,因此您返回 dataToSend
之前它有时间被 data
回调填充。
如果您想使用 async/await,您需要在此处将内容包装在 new Promise
中。在最后解码之前收集子进程的所有输出也是一个好主意,因为不能保证所有 JSON 都将在单个事件中传递。
const { spawn } = require("child_process");
const getWeatherReport = (location) => {
return new Promise((resolve, reject) => {
let buf = "";
const python = spawn("python", [
__dirname + "\weathergetter.py",
location.toString(),
]);
python.stdout.on("data", (data) => {
buf += data;
});
python.stderr.on("data", (data) => {
console.error(`stderr: ${data}`);
});
python.on("close", (code) => {
if (code !== 0) {
return reject(`child process died with ${code}`);
}
const dataToSend = JSON.parse(buf.toString().replace(/\'/g, '"'));
return resolve(dataToSend);
});
});
};
async function main() {
var wea = await getWeatherReport("kolkata");
console.log(wea);
}
main();
我认为发生了一些我无法弄清楚的异步事情
如果可能的话,请告诉我如何用 async-await
解决这个问题。
我的代码:
const {spawn} = require('child_process')
const getWeatherReport = (location) => {
let dataToSend, result
const python = spawn('python', [__dirname+'\weathergetter.py', location.toString()])
python.stdout.on('data', (data) => {
console.log('Pipe data from python script ...');
dataToSend = JSON.parse(data.toString().replace(/\'/g, '\"'));
// console.log(dataToSend)
})
python.stderr.on('data', data => {
console.error(`stderr: ${data}`)
})
python.on('close', (code) => {
console.log(`child process close all stdio with code ${code}`);
// console.log(dataToSend)
})
return dataToSend
}
var wea = getWeatherReport("kolkata")
console.log(wea)
Output:
undefined
Pipe data from python script ...
child process close all stdio with code 0
我希望函数 return 分配给 dataToSend
的 json object
。在这里,我实际上是在使用 python 脚本。
python脚本没有问题。当我在 python.stdout.on()
和 python.on()
中 console.log(dataToSend)
作为 在代码 中注释掉时,json 对象被打印到控制台。但是我不能使函数return成为json对象。
我关注的内容请参考这些:
- 主要是这个 -- https://medium.com/swlh/run-python-script-from-node-js-and-send-data-to-browser-15677fcf199f
- https://www.sohamkamani.com/blog/2015/08/21/python-nodejs-comm/
- https://towardsdatascience.com/python-pandas-in-node-js-application-47a76ae42a2a
注意:请不要像对我上一个问题所做的那样将此问题标记为重复。我可以理解堆栈溢出中已经有很多关于这个主题的post。但这对我的情况没有帮助。
我之前的 post 被关闭后我尝试了什么:
const {spawn} = require('child_process')
const getWeatherReport = async (location) => {
let dataToSend
const python = spawn('python', [__dirname+'\weathergetter.py', location.toString()])
python.stdout.on('data', async (data) => {
console.log('Pipe data from python script ...');
dataToSend = JSON.parse(data.toString().replace(/\'/g, '\"'));
// console.log(dataToSend)
})
python.stderr.on('data', data => {
console.error(`stderr: ${data}`)
})
python.on('close', (code) => {
console.log(`child process close all stdio with code ${code}`);
// console.log(dataToSend)
})
return await dataToSend
}
var wea = await getWeatherReport("kolkata")
console.log(`data: ${ await wea}`)
由于您没有使用 async/await 或回调,因此您返回 dataToSend
之前它有时间被 data
回调填充。
如果您想使用 async/await,您需要在此处将内容包装在 new Promise
中。在最后解码之前收集子进程的所有输出也是一个好主意,因为不能保证所有 JSON 都将在单个事件中传递。
const { spawn } = require("child_process");
const getWeatherReport = (location) => {
return new Promise((resolve, reject) => {
let buf = "";
const python = spawn("python", [
__dirname + "\weathergetter.py",
location.toString(),
]);
python.stdout.on("data", (data) => {
buf += data;
});
python.stderr.on("data", (data) => {
console.error(`stderr: ${data}`);
});
python.on("close", (code) => {
if (code !== 0) {
return reject(`child process died with ${code}`);
}
const dataToSend = JSON.parse(buf.toString().replace(/\'/g, '"'));
return resolve(dataToSend);
});
});
};
async function main() {
var wea = await getWeatherReport("kolkata");
console.log(wea);
}
main();