sklearnを使用するスクリプトをpyinstallerでexe化したら無限ループになった

現象

sklearnをimportして適当な文字列を表示するだけのスクリプトを, pyinstallerで実行可能ファイルにすることを考えます.
ubuntu,python3.6.9,sklearn==0.21.2で確認)

app.py

import sklearn

# ~処理~

print('HELLO sklearn!')
$ pyinstaller --onefile app.py

実行可能ファイルはデフォルトで ./dist 下に保存されます.
これを実行すると無限ループが始まります.

$ ./dist/app

実行結果

HELLO sklearn!
HELLO sklearn!
HELLO sklearn!
HELLO sklearn!
...

解決策

joblib(+おそらくsklearnも)のバージョンを下げることで解決しました.

  • joblib==0.11
  • scikit-learn==0.21.2

参考: sklearn/joblib spawns multiple copies when frozen on macOS
Macでも発生するようですが,Windowsでは大丈夫でした.

flaskアプリをexe化するとき発生したので,原因の特定が難しかったです.
無限ループに入ると「ポートが既に使用されている」エラーが表示されました.
そのため,最初は通信の問題だと思って調査して時間を溶かしてしまいました..