nodejsでスクレイピングをやろうと思い、pythonとの連携ができれば簡単そうだなと漠然と考えていたところにpython-shellなるnodejsの環境からpythonコードが実行できるライブラリがあると知り、試してみたが、期待通りに動かない。
自分が解決までに試したことを共有します
環境
MacBook Air
Apple M2
nodejs: v16.15.0
python: Python 3.11.2
python-shell: 5.0.0
解決までの流れ
python-shellの使い方を調べると上位の方に掲載されているサイトでは
const { PythonShell } = require('python-shell');
// runStringメソッド
PythonShell.runString('print("Hello world")', null, function (err, result) {
if (err) throw err;
console.log(result);
});
// runメソッド(pythonファイルを指定して実行させる)
PythonShell.runString('test.py', null, function (err, result) {
if (err) throw err;
console.log(result);
});
のようにrunStringメソッドやrunメソッドの第三引数にコールバック関数を与えてエラーハンドリングやconsole.logしているが、実行してもpythonが走っている形跡がない。
runStringメソッドの方ではpythonの出力がresultに格納されてconsole.logされる予定らしいがどうもこれも出力されていない。
もしやエラーハンドリングの段階でつまづいている?と思い
const { PythonShell } = require('python-shell');
console.log('run1');
PythonShell.runString('print("Hello world")', null, function (err, result) {
if (err) throw err;
console.log(result);
});
console.log('run2');
/** 結果
* run1
* run2
* /
とconsole.logで挟んでみたがしっかりrun2も出力されてる(やり方良くないかもだけど…)
axiosみたいにthen節をケツにつけてはどうかと思い下記を実行
const { PythonShell } = require('python-shell');
PythonShell.runString('print("Hello world")', null)
.then((response) => {
console.log(response);
})
.catch((error) => {
console.log(error);
});
// 結果 [ 'Hello world' ]
コールバックの呼び出し方が変わったのか?
↑というか公式に書いてあった
結論
とっつきにくくて誰かが解説してくれてるやつもいいけど公式ドキュメント読もう🤯
おわりに
pythonは比較的最近プログラム書き始めた人がよく使ってるイメージあるので同じような問題にブチ当たった人の為になればと思い書いてみました。
英語で難解に感じるが、コードは共通語なので公式が出してくれているドキュメントがなんだかんだ一番参考になるという自らへの教訓でもありました。