Tengo una aplicación node.js que necesita pasar la entrada a un programa de python y recuperar la entrada. Este proceso debe ocurrir con frecuencia y con la menor latencia posible. Por lo tanto, he elegido usar el paquete child_process. El código javascript está debajo
child_process = require('child_process'); class RFModel { constructor () { this.answer = null; this.python = child_process.spawn('python3', ['random_forest_model.py']); this.python.stdout.on('data', (data)=>{ this.receive(data); }); } send (data) { this.answer = null; this.python.stdin.write(data); } receive (data) { data = data.toString('utf8') console.log(data) this.answer = data; } } const model = new RFModel() function timeout(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } (async ()=>{ await timeout(7000) model.send('asdf') })();Y este es el código de Python:
import sys sys.stdout.write('test') sys.stdout.flush() for line in sys.stdin: open("test.txt", "a") #janky test if input recieved sys.stdout.write(line) sys.stdout.flush()El proceso de nodejs recibe la primera salida de "prueba" del proceso de python, pero no parece que python reciba ninguna entrada de nodejs, ya que no se está creando ningún archivo de texto o eco. ¿Qué estoy haciendo mal?
No soy un experto en python, pero presumiblemente, for line in sys.stdin: está esperando una línea real (una serie de caracteres seguidos de un carácter de salto de línea). Pero, desde su programa nodejs no está enviando un carácter de salto de línea. Solo estás enviando una serie de caracteres. Entonces, su programa Python todavía está esperando que el carácter de salto de línea signifique el final de la línea.
Intenta cambiar esto:
model.send('asdf')a esto:
model.send('asdf\n')Cuando lo ejecuto ahora con este cambio, obtengo este resultado:
test asdf Donde hay un retraso antes de que aparezca el asdf .