Cuando se trata de desarrollo web, nada supera a JavaScript. Pero a veces tenemos que hacer una tarea un poco más exigente, por ejemplo, analizar una gran cantidad de datos En ese caso, Python podría ser una opción superior. Sin embargo, esa es solo una función de nuestro sitio web. ¿Queremos cambiar a Python únicamente por esa característica? Probablemente no.
Eso sería genial, ¿verdad? Podemos usar child processen Node JS para ejecutar un script de Python cuando sea necesario.
const spawn = require('child_process').spawn
app.get("process_data", (req, res) => {
spawn('python3', ['script.py'])
})
# script.py
doSometing()
Y si queremos, también podemos pasar datos a nuestro script de Python.
const spawn = require('child_process').spawn
app.get("process_data", (req, res) => {
const msg = "Hello"
spawn('python3', ['script.py', msg])
})
En Python para poder leer los datos debes importar el módulo sys.
import sys, json
def main():
msg = sys.argv[1]
doSometing(msg)
if __name__ == '__main__':
main()
Ahora, en lugar de pasar datos mientras se genera el proceso de Python, enviemos datos en flujo.
const spawn = require('child_process').spawn,
const py = spawn('python3', ['script.py'])
const data = {
msg: "Hello"
}
py.stdin.write(JSON.stringify(data)) //we have to send data as a string, so we are using JSON.stringify
py.stdin.end()
import sys, json
def main():
lines = sys.stdin.readlines()
data = json.loads(lines)
doSometing(data['msg'])
if __name__ == '__main__':
main()
Finalmente, podemos enviar una respuesta a nuestros nodejs desde el script de Python
const spawn = require('child_process').spawn
const py = spawn('python3', ['cscript.py'])
py.stdout.on('data', function(res){
let data = JSON.parse(res.toString())
console.log(data)
})
import sys
# You will have your own implementation of get data. In this case lets assume it returns a dict/json
res = getData()
print(json.dumps(data))
sys.stdout.flush()
Recuerda que puedes acceder a todos los cursos desde tu panel de usuario.