PythonShell en el nodo (nwjs)

Estoy intentando crear una aplicación nw.js que se comunique con Python mediante el módulo de nodo PythonShell.

El problema que tengo es que no se escribe nada en la consola a menos que cierre la entrada estándar. Sin embargo, me gustaría mantener el flujo abierto para poder enviar varios comandos al script de Python y hacer que Python guarde su estado.

Aquí están mis guiones:

script.py

import sys def main(): command = sys.stdin.readlines() # unused for now sys.stdout.write("HELLO WORLD") sys.stdout.flush() if __name__ == '__main__': main() 

main.js

 var PythonShell = require('python-shell'); var pyshell = new PythonShell('script.py'); pyshell.on('message', function (message) { console.log(message); }); pyshell.send('hello'); 

En este punto, no pasa nada.

Si hago pyshell.end() , entonces HELLO WORLD se pyshell.end() a la consola. Pero entonces no puedo emitir más comandos pyshell.send .

¿Cómo puedo mantener el proceso hijo de Python ejecutándose y esperando la entrada, y canalizando toda la salida a JS?

Un par de problemas:

  • Use sys.stdin.readline() lugar de sys.stdin.readlines() . De lo contrario, Python continuará esperando que termines la secuencia de entrada. Debería poder enviar una señal ^D para terminar el final de la entrada, pero eso no funcionó para mí.

  • Para mantener el flujo abierto, ajuste la entrada de la línea de comandos en un bucle (consulte el código de Python a continuación)

También es importante:

  • La entrada automáticamente anexa \n , pero la salida no. Por la razón que sea, la salida necesita \n y sys.stdout.flush() para funcionar; uno u otro no lo cortará.

  • Python-shell parece almacenar en caché el código de Python. Por lo tanto, si realiza cambios en su archivo Python, debe reiniciar la aplicación nwjs para que tenga efecto.

Aquí está el código de muestra completo que funciona:

script.py

 import sys def main(): while True: command = sys.stdin.readline() command = command.split('\n')[0] if command == "hello": sys.stdout.write("You said hello!\n") elif command == "goodbye": sys.stdout.write("You said goodbye!\n") else: sys.stdout.write("Sorry, I didn't understand that.\n") sys.stdout.flush() if __name__ == '__main__': main() 

main.js

 var PythonShell = require('python-shell'); var pyshell = new PythonShell('script.py'); pyshell.on('message', function (message) { console.log(message); }); pyshell.send('hello'); 

Ahora use pyshell.send("hello") , pyshell.send("goodbye") , o pyshell.send("garbage") y reciba una respuesta inmediata en la consola JS.