みかづきブログ・カスタム

基本的にはちょちょいのほいです。

python-shell(5.0.0)からコールバック関数の渡し方が変更になっていることに気づく 🤖

Node.jsからPythonスクリプトを実行できるpython-shell
僕はNode.jsのサーバからmyCobotを操作する際に活用しています。

blog.kimizuka.org

基本的には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までということに気づきました。

github.com


執筆時最新(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 のコードも修正して、動作を確認せねば。。