プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2021/06/16

Python で作成したアプリを単一の実行ファイルにする

update2021/08/13 event_note2021/06/16 8:01

python で作成したアプリを、他のマシン(ネットに繋がっていなかったり、python のバージョンが異なるマシン)で動作させたかったので、単一の実行ファイルを作成して配布することにしました。

環境

  • 開発環境:Ubuntu
  • 実行環境:Wind River Linux

要は、Ubuntu で作成したアプリを Wind River Linux で動作させたいだけです

単一実行ファイルの作成

pyinstaller をインストールします。

$ pip install pyinstaller

以下のコマンドで単一のファイルが作成できます。

$ pyinstaller sample.py --onefile

dist フォルダ内にバイナリファイルが作成されています。

動的リンクエラーを回避する

上記で作成したファイルを実行して動けば何の問題もないのですが、私の場合、実行環境で以下のようなエラーが表示されました。

[2841] Error loading Python lib '/tmp/_MEI1GKxS0/libpython3.8.so.1.0': dlopen: /lib64/libm.so.6: version `GLIBC_2.29' not found (required by /tmp/_MEI1GKxS0/libpython3.8.so.1.0)

これについて、以下の記事が参考になりました。

今回は Ubuntu で作成したものを Wind River で動かしたので、動的リンクでエラーになったようなのですが、StaticX というツールを使えば静的リンクのみの実行ファイルが作成できるようです。

StaticX のインストールと実行

$ pip install staticx

尚、環境によっては patchelf のインストールも必要みたいです。

$ pip install patchelf-wrapper

あとは、以下のようにして実行するだけです。

$ staticx <pyinstallerで作成したバイナリファイル> <出力ファイル名>

これで作成したファイルを使うと、無事に実行できました。