2017-11-05 6 views
1

を使ってPythonにNodeJSからTypedArrayデータを送信します。私のPythonスクリプトにはfloat32配列が必要ですが、python-shellを使ってそのデータ型を送信する方法がわかりません。私は問題なく文字列を送ることができ、私は私のpythonスクリプトがうまく動作することを知っています。直接配列を送信する方法があるのですか、またはPythonでデータの変換や解析を行う必要がありますか?ここで最善の方法は、私のpython-シェルを使用してPythonで処理するNodeJSからデータを送信しようとしているの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) 

TypedArrを変換すると文字列を渡すのはうまくいきますが、配列ではなくPythonでこの長い文字列を受け取るのは間違いです。私は単純な修正があると確信しています。どんなアドバイスも大変ありがとう!

+1

多分これは役立ちますか? https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer メッセージは、あなたが移動するための方法であるべきバッファオブジェクトを、使用することができます示唆しています。 – sapht

+0

私はこれが最善の選択肢のように思われることに同意します。私がJSバッファ(例えばBuffer.from( 'test'))を送信した場合、上記のエラーは発生せず、成功コールバックはpyshell.send()呼び出しでヒットしますが、何らかの理由でPythonスクリプトが実行される。私はそれが{mode: 'binary'}の使用と関係しているのだろうかと思いますか?私はまだバッファのための実用的なバイナリモードを持っていません – milesaron

+0

ありがとうございます。 SOが私にできるように2日で私の答えを受け入れる... – milesaron

答えて

1

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); 
}); 

で:また、私はノードで

...バイナリモードのためではなく、readmeののpythonシェルテストスクリプトであるpyshell.stdout.onにpyshell.onから切り替えるために必要なPythonの:

input_data = np.frombuffer(sys.stdin.read(), dtype=np.float32) 
sys.stdout.write(input_data) 
0

私は直接の方法についてはわかりませんが(私もそうではないと思いますが)、JSON.stringifyをJavaScript側で使用して、配列を文字列に変換し、Pythonに送信し、rawとして読み込みます入力し、それをjsonオブジェクト(配列になります)に変換します。

JAVASCRIPT側:

var a = [1,2,3]; 
pyshell.send(JSON.stringify(data), ....) 

PYTHON側:私はJavaScriptのバッファオブジェクトおよび使用する 'バイナリ' モードに自分のfloat32アレイを変換端で

import json,sys 
input = sys.stdin.read() 
print(json.loads(input)) 
関連する問題