こんにちは。
こちらの記事は、Python-shellを用いたNode.jsとpythonの連携時に発生したバグの
解決方法について、自らの経験を記述しているものです。
英語が分かる方はこちらの公式ドキュメントを参照していただいた方が正確ですので
ご参照ください。
https://www.npmjs.com/package/python-shell
バージョン
python 3.8.1
pyenv 1.2.17
node.js 13.3.0
##問題
Node.jsからpythonのスクリプトに引数を渡して実行させ、実行結果を
Node.jsで受け取ったところ、
python側の出力では正しくjsonデータが送られているのですが、
Node.js側では空文字からなるリスト['']しか受け取れないという現象が発生しました。
また、この現象が発生した際には、pyenvを用いて作成した環境下で行っていたのですが、
system環境で実行したところ、正常に値を受け取ることが判明し、
環境の違いによってコードが動いたり、動かなかったりする状態でした。
該当コードは以下の通りです。
Node.js側のコード
let {PythonShell} = require('python-shell');
let options = {args:[input_string]};
PythonShell.run('data_processing.py', options, function(err, data){
if (err) throw err;
console.log(JSON.parse(data));
});
Python側のコード
import json
import sys
data_info = sys.argv[1]
'''
コード中略
'''
print(json.dumps(output_json))
##解決策
Node.js側のコードのoption変数に以下のコードを付け足すことで
pyenvで作成した環境下でも動作するようになりました。
//修正前
let options = {args:[input_string]};
//修正後
let options = {pythonOptions:['-u'],
args:[input_string]};
ドキュメントによると
pythonOptions
pythonへ渡す際のオプションスイッチの配列で、リアルタイムにprint()の結果を
受け取る際には、['-u']を指定する必要があるとのことです。
必ずつけ忘れないようにしましょう。
以上です。