我正在尝试在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"
我基本上希望以一种慢慢的方式进行沟通:
另一个问题: 在https://github.com/extrabacon/python-shell的教程中写道,你必须编写pyshell.on()来等待数据,而在源代码中作者写了pyshell.stdout.on()。那是为什么?
谢谢! (更正了python错误的缩进)
答案 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);
});