2017-02-25 56 views
3

我想創建一個使用節點模塊PythonShell與Python進行通信的nw.js應用程序。節點中的PythonShell(nwjs)

我遇到的問題是除非我關閉標準輸入,否則什麼也不會寫入控制檯。不過,我想保持流打開,以便我可以發送多個命令到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

我應該注意我也嘗試使用'child_process.spawn'模塊直接(而不是pythonshell)與相同的問題 – Jeff

回答

2

兩個問題:

  • 使用sys.stdin.readline()而不是sys.stdin.readlines()。否則,Python將繼續等待您完成輸入流。您應該能夠發送一個^D信號來終止輸入的結束,但這對我不起作用。

  • 爲了保持流開放,包裹在命令行輸入在一個循環中(見下文Python代碼)

同樣重要的:

  • 輸入自動追加\n,但輸出不不。無論出於何種原因,輸出需要\nsys.stdout.flush()才能工作;一個或另一個不會削減它。

  • Python-shell似乎緩存你的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控制檯中立即響應!

相關問題