Node.jsからPythonスクリプトを実行できるpython-shell。
僕はNode.jsのサーバからmyCobotを操作する際に活用しています。
基本的にはrunStringメソッドを使ってPythonでコードを実行しています。
ものすごくシンプルに書くと、
import { PythonShell } from 'python-shell'; PythonShell.runString('x = 1 + 1; print(x);');
これだけで、Python上で 1 + 1 の答えを変数に代入し、標準出力で出力します。
で、処理が完了した際のコールバックを書く際は、
import { PythonShell } from 'python-shell'; PythonShell.runString('x = 1 + 1; print(x);', null, (err) => { if (err) { console.error(err); } console.log('finished'); });
という感じで、第3引数にコールバック関数を渡していたのですが、最近、コールバックが実行されないことに気づき、調べてみたところ、この記法はv3.0.0までということに気づきました。
執筆時最新(5.0.0)では、runStringがPromiseを返すようになっているため、コールバックはthenを使って書くことができるようになりました。
import { PythonShell } from 'python-shell'; PythonShell.runString('x = 1 + 1; print(x);', null).then(() => { console.log('finished'); }).catch((err) => { console.error(err); });
また、thenの引数には標準出力が、出力順に配列に入って返ってくるようです。
import { PythonShell } from 'python-shell'; PythonShell.runString('x = 1 + 1; print(x);', null).then((evt) => { console.log(evt); // -> [ '2' ] }).catch((err) => { console.error(err); });
import { PythonShell } from 'python-shell'; PythonShell.runString('print(0); print(1); print(2);').then((evt) => { console.log(evt); // -> [ '0', '1', '2' ] }).catch((err) => { console.error(err); });
ただし、型はstringで返ってきます。
import { PythonShell } from 'python-shell'; PythonShell.runString('x = 1 + 1; print(x);', null).then((evt) => { console.log(typeof evt[0]); // -> string }).catch((err) => { console.error(err); });
今回は以上です。定期的にドキュメントを読み返そうと思ったできごとでした。
https://blog.kimizuka.org/entry/2024/02/01/141808 のコードも修正して、動作を確認せねば。。