如何创建一个通用的 JavaScript 函数,它可以 运行 python 脚本和 json 格式的 return 数据(如果有)?
How to create a generalized JavaScript function that can run python scripts and return data in json format if any?
我目前能做什么
const { spawn } = require("child_process");
exports.fetchWeatherdata = (location) => {
console.log("DIR NAME DB" + __dirname)
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);
});
});
};
//in another file
const { fetchWeatherdata } = require('../python/weather')
exports.sendData = (req, res) => {
console.log(req.query)
console.log(req.params)
async function main() {
var wea = await fetchWeatherdata(req.params.loc);
// console.log(wea);
res.send(wea)
}
main()
}
我想达到的目标
const { spawn } = require("child_process");
exports.pythonFileRunner = (pathToFile, arguments) => {
// some code goes here. This is where I need help
return "output of the python file "
}
//in another file
const { pythonFileRunner } = require('../python/weather')
exports.fetchWeatherdata = (location) => {
//something like this ↓↓↓
data = pythonFileRunner("path/to/file/main.py", location)
return data
}
基本上,我想创建一个函数,它可以 运行 任何给定的 python 文件,有或没有参数以及 return 它的输出。
请注意:我想完成 pythonFileRunner()
函数中的所有 async-await
内容。这个函数必须return只有输出,我可以根据我的用例修改
如果我采取了错误的方法,请在评论中告诉我。
应该基本一样。只需更换
const python = spawn("python", [
__dirname + "/weathergetter.py",
location.toString(),
]);
和
const python = spawn("python", [
pathToFile,
...arguments
]);
我稍微修改了 fetchweatherdata 函数以获得我想要的。
const { spawn } = require("child_process");
function pythonRunner(path, arguments) {
return new Promise((resolve, reject) => {
let buf = "";
arguments.unshift(path)
const python = spawn("python", arguments);
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 = buf
return resolve(dataToSend);
});
});
}
//in any other file
//first import the function
//how to use the function
(async () => {
data = await pythonRunner("path/to/python/file", ["arg1", "arg2"])
console.log(data)
})()
我目前能做什么
const { spawn } = require("child_process");
exports.fetchWeatherdata = (location) => {
console.log("DIR NAME DB" + __dirname)
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);
});
});
};
//in another file
const { fetchWeatherdata } = require('../python/weather')
exports.sendData = (req, res) => {
console.log(req.query)
console.log(req.params)
async function main() {
var wea = await fetchWeatherdata(req.params.loc);
// console.log(wea);
res.send(wea)
}
main()
}
我想达到的目标
const { spawn } = require("child_process");
exports.pythonFileRunner = (pathToFile, arguments) => {
// some code goes here. This is where I need help
return "output of the python file "
}
//in another file
const { pythonFileRunner } = require('../python/weather')
exports.fetchWeatherdata = (location) => {
//something like this ↓↓↓
data = pythonFileRunner("path/to/file/main.py", location)
return data
}
基本上,我想创建一个函数,它可以 运行 任何给定的 python 文件,有或没有参数以及 return 它的输出。
请注意:我想完成 pythonFileRunner()
函数中的所有 async-await
内容。这个函数必须return只有输出,我可以根据我的用例修改
如果我采取了错误的方法,请在评论中告诉我。
应该基本一样。只需更换
const python = spawn("python", [
__dirname + "/weathergetter.py",
location.toString(),
]);
和
const python = spawn("python", [
pathToFile,
...arguments
]);
我稍微修改了 fetchweatherdata 函数以获得我想要的。
const { spawn } = require("child_process");
function pythonRunner(path, arguments) {
return new Promise((resolve, reject) => {
let buf = "";
arguments.unshift(path)
const python = spawn("python", arguments);
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 = buf
return resolve(dataToSend);
});
});
}
//in any other file
//first import the function
//how to use the function
(async () => {
data = await pythonRunner("path/to/python/file", ["arg1", "arg2"])
console.log(data)
})()