2017-02-25 5 views
3

ノードモジュールPythonShellを使用してPythonと通信するnw.jsアプリケーションを作成しようとしています。ノード内のPythonShell(nwjs)

問題は、私がstdinを閉じるまでコンソールに何も書き込まれていないということです。しかし、ストリームを開いたままにして、Pythonスクリプトに複数のコマンドを送り、Pythonに状態を保存させたいと思います。ここで

は私のスクリプトは、次のとおりです。

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

この時点では、何も起こりません。

pyshell.end()を実行すると、HELLO WORLDがコンソールに出力されます。しかし、私はさらにpyshell.sendコマンドを発行することはできません。

どのようにPythonの子プロセスを実行して入力を待っても、すべての出力をJSにパイプで戻すことはできますか?

+0

私は同じ問題を持つ 'pythonshellの代わりに' child_process.spawn'モジュールを直接使ってみました – Jeff

答えて

2

問題のカップル:

  • 利用sys.stdin.readline()の代わりsys.stdin.readlines()。そうしないと、Pythonは入力ストリームを終了するのを待ちます。 ^D信号を送信して入力の終わりを終了できるはずですが、それは私にとってはうまくいかないでしょう。

    • 入力が自動的に\nを追加しますが、出力が行われます。また

    重要(以下Pythonコードを参照してください)ループ内でのコマンドライン入力をラップし、オープンストリームを維持するために

  • ない。どんな理由であれ、出力には\nsys.stdout.flush()の両方が必要です。どちらか一方がそれを切断しません。

  • PythonシェルがPythonコードをキャッシュしているようです。したがって、Pythonファイルを変更した場合は、nwjsアプリケーションを再起動して有効にしなければなりません。

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

    pyshell.send("hello")pyshell.send("goodbye")、またはpyshell.send("garbage")を使用して受信します。ここ

サンプル全体の動作するコードですJSコンソールでの即時対応

関連する問題