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で作成したバイナリファイル> <出力ファイル名>
これで作成したファイルを使うと、無事に実行できました。