2017-02-25 4 views
3

Ich versuche, eine nw.js-Anwendung zu erstellen, die mit Python über das Knotenmodul PythonShell kommuniziert.PythonShell in Knoten (nwjs)

Das Problem, das ich habe, ist, dass nichts auf die Konsole geschrieben wird, bis ich die Standardeingabe schließe. Allerdings möchte ich den Stream geöffnet lassen, damit ich mehrere Befehle an das Python-Skript senden und Python seinen Status speichern kann.

Hier meine Skripte sind:

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'); 

An diesem Punkt, passiert nichts.

Wenn ich pyshell.end() mache, wird HELLO WORLD an die Konsole ausgegeben. Aber dann kann ich keine weiteren pyshell.send Befehle ausgeben.

Wie kann ich den untergeordneten Python-Prozess laufen lassen und auf Eingabe warten, aber alle Ausgaben zurück zu JS leiten?

+0

Ich sollte beachten, ich habe auch versucht, mit dem 'child_process.spawn' Modul direkt (anstelle von Pythonshell) mit dem gleichen Problem – Jeff

Antwort

2

Ein paar Probleme:

  • Verwenden sys.stdin.readline() statt sys.stdin.readlines(). Andernfalls wartet Python weiterhin auf die Beendigung des Eingabestreams. Sie sollten in der Lage sein, ein ^D Signal zu senden, um das Ende der Eingabe zu beenden, aber das hat nicht für mich funktioniert.

  • den Strom offen zu halten, wickelt die Eingangsbefehlszeile in einer Schleife (siehe Python Code unten)

wichtig:

  • Eingang anhängt automatisch \n, aber Ausgang tut nicht. Aus welchem ​​Grund auch immer, Output benötigt sowohl \n als auch sys.stdout.flush() um zu arbeiten; der eine oder andere wird es nicht schneiden.

  • Python-Shell scheint Ihren Python-Code zu cachen. Wenn Sie also Änderungen an Ihrer Python-Datei vornehmen, müssen Sie die Anwendung nwjs neu starten, damit sie wirksam wird.

Hier ist die vollständige Beispielcode, der funktioniert:

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'); 

Jetzt pyshell.send("hello"), pyshell.send("goodbye") oder pyshell.send("garbage") verwenden und erhalten eine sofortige Antwort in der JS-Konsole!