我正在尝试使用python-shell从NodeJS发送数据到Python进程。我的Python脚本需要一个float32数组,但我不知道如何使用python-shell发送该数据类型。我可以发送一个没有问题的字符串,我知道我的python脚本工作正常。有没有办法直接发送数组,还是我需要在python中进行一些数据转换或解析?
以下是我现在正在尝试的内容:
在Python中:
import sys
input = sys.stdin.read()
print type(input)
在节点中:
var PythonShell = require('python-shell');
var pyshell = new PythonShell('script.py', {mode:'binary'});
// data is float32 TypedArray
pyshell.send(data).end(function(err){
if (err){console.log(err, 'did not work')};
});
pyshell.on('message', function (message) {
console.log('message received', message);
});
这里我收到以下错误:
net.js:655
throw new TypeError(
^
TypeError: Invalid data, chunk must be a string or buffer, not object
at Socket.write (net.js:655:11)
at PythonShell.send (/project/node_modules/python-shell/index.js:205:16)
at Object.<anonymous> (/project/server.js:59:11)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.runMain (module.js:604:10)
at run (bootstrap_node.js:394:7)
如果我将TypedArray转换为字符串,它会发送正常,但在Python而不是数组中接收这个长字符串感觉不对。我确信有一个简单的解决方法。任何建议都会非常感激!
答案 0 :(得分:1)
最后我将我的float32数组转换为javascript Buffer对象并使用'binary'模式。另外我需要从pyshell.on切换到pyshell.stdout.on,它位于二进制模式的python-shell测试脚本中,但不在自述文件中...
在节点中:
var options = {mode: 'binary'};
var pyshell = new PythonShell('test.py', options);
var data = Buffer.from(myFloat32TypedArray.buffer, 'float32');
pyshell.send(data).end(function(err){
if (err){
console.log(err)
}else{
console.log('data sent')
};
});
pyshell.stdout.on('data', function (data) {
console.log(data);
});
在Python中:
input_data = np.frombuffer(sys.stdin.read(), dtype=np.float32)
sys.stdout.write(input_data)
答案 1 :(得分:0)
我不知道直接的方式(我认为它也不可用)但你可以在javascript端使用JSON.stringify
将数组转换为字符串,发送它到python,将其作为原始输入读取并将其转换回json对象(将是一个数组)。
JAVASCRIPT SIDE:
var a = [1,2,3];
pyshell.send(JSON.stringify(data), ....)
PYTHON SIDE:
import json,sys
input = sys.stdin.read()
print(json.loads(input))