与python-shell和node.js进行双向通信

时间:2015-07-01 13:32:29

标签: javascript python node.js

我正在尝试在node.js和python-shell之间进行通信。我能够从python-shell-object接收数据但是当我尝试向python-shell发送消息时它会崩溃。

我的app.js:

var PythonShell = require('python-shell');

var options = {
    scriptPath: '/home/pi/python'
};

var pyshell = new PythonShell('test.py', options, {
    mode: 'text'
});

pyshell.stdout.on('data', function(data) {
    pyshell.send('go');
    console.log(data);
});

pyshell.stdout.on('data2', function(data) {
    pyshell.send('OK');
    console.log(data);
});

pyshell.end(function(err) {
    if (err) throw err;
    console.log('End Script');
});

和我的test.py:

import sys
print "data"
for line in sys.stdin:
    print "data2"

我基本上希望以一种慢慢的方式进行沟通:

  1. 从python
  2. 收到“数据”
  3. 发送“go”到python
  4. 从python
  5. 收到“data2”

    另一个问题: 在https://github.com/extrabacon/python-shell的教程中写道,你必须编写pyshell.on()来等待数据,而在源代码中作者写了pyshell.stdout.on()。那是为什么?

    谢谢! (更正了python错误的缩进)

1 个答案:

答案 0 :(得分:3)

您的代码展示了对python-shell的错误使用。我在下面列出了一些注意事项。但是,这正是我主要发现的错误所以它只会纠正python-shell库的使用,但它可能不一定会删除Python对应的所有问题。

错误使用stdout.on('data')

您似乎错误地使用了事件处理程序stdout.on。处理程序采用“data”作为参数表示从Python脚本打印输出消息时发生的事件。无论打印什么消息,这始终为stdout.on('data')

这个无效

pyshell.stdout.on('data2', function(data) { .... })

它应该始终是

pyshell.stdout.on('data', function(data) { .... })

将消息中继到Python时,应将命令括在end

你应该改变:

pyshell.send('OK');

对此:

pyshell.send('OK').end(function(err){
    if (err) handleError(err);
    else doWhatever();
})

因此,纠正这两个错误,你的代码应该成为:

pyshell.stdout.on('data', function(data) {
    if (data == 'data') 
        pyshell.send('go').end(fucntion(err){
            if (err) console.error(err);
            // ...
        });
    else if (data == 'data2')
        pyshell.send('OK').end(function(err){
            if (err) console.error(err); 
            // ...
        });
    console.log(data);
 });