Pythonのファイルをコンパイル

Pythonで作ったプログラムを、そのうちPythonが入っていないPCでも実行したくなるよね、という事で、Exe化するソフトを使ってみました。
Pyinstallerというソフトです。

Pyinstallerのサイトはこちら

インストールは下記の通り。

pip install pyinstaller

使い方は下記の通り。

pyinstaller test.py

一つのファイルにまとめるオプションや、コンソールを開かないオプションなどがあるようです。

pyinstaller --onefile --noconsole test.py

一つのファイルにまとめる事が出来るのは便利そうですよね。
で、早速やってみたところ …

OSError: Python library not found: libpython3.6.so.1.0, libpython3.6mu.so.1.0, libpython3.6m.so.1.0

あれ?うまく行ってない。Pythonライブラリの3.6が入っていないようです。
そんなばかな、うちのPCには3.6が入っているはずです。

python -V
Python 3.6.5 :: Anaconda, Inc.

ほらね。

しばらく調べたところ、、、
私のPCの/usr/lib64/にはlibpython2.7.soが入っている。
あれ?3.6.5はどこ?

大分調べたところ、anacondaをインストールしたフォルダにあるようで、ここはリンクが貼られていない様子。
私はhomeにanacondaをインストールしたので、下記のところにありましたよ。

/home/user/anaconda3/lib

なるほどーそうかー。
これをLD_LIBRARY_PATHに追加すればよいようです。
.bashrcに下記を書き加えます。書き換えるファイルはOSなどの環境によって違いますね。

export LD_LIBRARY_PATH="/home/user/anaconda3/lib:$LD_LIBRARY_PATH"

ターミナルをいったん閉じてまた開ける。
再度pyinstallerを実行して、無事にexeがdistフォルダの中にできました。結構時間かかりますね。
anacondaをインストールした時に、インストーラが.bachrcを書き換えたのは見ていたのですが、binを追加しただけで、pathは追加されていなかったようです。
出来たファイルを実行してみましょう。

./test

うまく行きました。さほど深くはまらずにできて良かった。
これ、linux上でコンパイルしたんですが、windowsでも動くのかな?と思い、windows10にコピーしてきてやってみましたが、それはダメでした。
そりゃそうか。
試しに他のlinuxにtestをコピーしてみたら、無事動きました。

ところで、コンパイルの方法にはバイトコンパイルというものもあるそうです。
バイトコンパイル

python -m compileall test.py

__pycache__の中に.pycというファイルがあり、これが実行形式なのだそう。
実行環境が改善する事があるそうですが、、、今の私の小さいプログラムだとありがたみが分かりませんね。