ものづくりのブログ

うちのネコを題材にしたものづくりができたらいいなと思っていろいろ奮闘してます。

【python】ubuntu で pyinstaller を使ったらエラーが出た困った話

ubuntu で pyinstaller を使ったらエラーが出た困った時の対応方法をメモします。

症状

ubuntu の環境で pyinstaller を使ったら以下のエラーが出てきました。

エラーメッセージ

pyinstaller コマンドを実行すると以下のエラーメッセージが表示されます。

$ pyinstaller xxxxx.py --onefile 
・
・
・
・
OSError: Python library not found: libpython3.9mu.so.1.0, libpython3.9m.so.1.0, libpython3.9.so.1.0, libpython3.9.so, libpython3.9m.so
    This would mean your Python installation doesn't come with proper library files.
    This usually happens by missing development package, or unsuitable build parameters of Python installation.

    * On Debian/Ubuntu, you would need to install Python development packages
      * apt-get install python3-dev
      * apt-get install python-dev
    * If you're building Python by yourself, please rebuild your Python with `--enable-shared` (or, `--enable-framework` on Darwin)

エラーの内容

開発パッケージがないか、Python インストールのビルドパラメーターが不適切なために起こってますとのこと...
どうやら"--enable-shared"というオプションをつけて Python を再構築してくれとのこと...

対応したこと

実行環境確認

cat コマンドでOSのバージョンを確認してみます。

$ cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.2 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.2 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal

回避策

以下のコマンドで python のバージョンを確認します。

$ pyenv versions
  system
  3.7.8
* 3.9.6 (set by /home/{xxx}/xxxxx/.python-version)

とりあえず問題のあったバージョン(3.9.6)に、pyenv でオプションに「--enable-shared」をつけて pyton を再インストールしました。

$ PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.9.6
pyenv: /home/{xxx}.anyenv/envs/pyenv/versions/3.9.6 already exists
continue with installation? (y/N) y
Downloading Python-3.9.6.tar.xz...
-> https://www.python.org/ftp/python/3.9.6/Python-3.9.6.tar.xz
Installing Python-3.9.6...
Installed Python-3.9.6 to /home/{xxx}/.anyenv/envs/pyenv/versions/3.9.6

再度 pyinstaller 実行

再度 pyinstaller コマンドを実行したところ処理が成功しました。

$ pyinstaller xxxxx.py --onefile 
45 INFO: PyInstaller: 4.5.1
46 INFO: Python: 3.9.6
48 INFO: Platform: Linux-5.4.0-77-generic-x86_64-with-glibc2.31

(省略)

23413 INFO: checking EXE
23413 INFO: Building EXE because EXE-00.toc is non existent
23413 INFO: Building EXE from EXE-00.toc
23427 INFO: Appending archive to ELF section in EXE /home/{xxx}/xxxxx/dist/xxxxx
23666 INFO: Building EXE from EXE-00.toc completed successfully.