LoginSignup
0
1

More than 3 years have passed since last update.

Pythonのprint出力をNode.jsが認識できない問題について

Last updated at Posted at 2020-03-31

こんにちは。
こちらの記事は、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側のコード

connect_test.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側のコード

data_processing.py
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']を指定する必要があるとのことです。

必ずつけ忘れないようにしましょう。
以上です。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1