使用python-shell从NodeJS向Python发送TypedArray数据的最佳方法

时间:2017-11-05 18:00:54

标签: python node.js

我正在尝试使用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而不是数组中接收这个长字符串感觉不对。我确信有一个简单的解决方法。任何建议都会非常感激!

2 个答案:

答案 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))