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 } Básicamente, quiero crear una función que pueda ejecutar cualquier archivo de Python con o sin argumentos y devolver su salida.
Tenga en cuenta: quiero terminar todas las cosas async-await dentro de la función pythonFileRunner() . Esta función debe devolver solo la salida, que puedo modificar según mi caso de uso
Si estoy tomando el enfoque equivocado, házmelo saber en los comentarios.
Debe ser básicamente lo mismo. solo reemplaza
const python = spawn("python", [ __dirname + "/weathergetter.py", location.toString(), ]);con
const python = spawn("python", [ pathToFile, ...arguments ]);He modificado un poco la función fetchweatherdata para obtener lo que quería.
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) })()