ローカルで作成していたスクリプトから関数を分離し、モジュールにまとめ、パッケージ化した。
main.pyではこのモジュールをimportしていろいろやっている。
ここで、main.pyをexe化して配布したくなった。
しかし、PCにはNumpyやPandasなど容量の大きなライブラリがインストールされており、
そのままexe化すると容量の大きなファイルになってしまう。
仮想環境にローカルにあるパッケージをインポートしてmain.pyをpyinstallerでexe化すれば、
NumpyやPandasを除外し、必要なローカルのパッケージだけ同梱できるはず。
しかし、仮想環境に直接パッケージをインポートすることはできないようで、
パッケージをライブラリにする必要がある。
ライブラリ内には表に出したくない情報が載っているので、PyPIやGit上に公開したくない。
よって、自作ライブラリを公開せずに仮想環境下でpipインストールできるような方法を探していた。
ネット記事をつまみ食いして編み出したのが以下の方法
orenolib:ライブラリ
main.py:exe化したいスクリプト。mylibパッケージを参照する
mylib:main.pyで参照するパッケージ。モジュール2個入り。
階層はこんな感じ。
orenolib
├── setup.py
├── main.py
└── mylib
├── __init__.py
└── function1.py
└── function2.py
この状態でorenolib上に.venvフォルダを作成し、activateして仮想環境へ。
orenolib
├ .venv
├── setup.py
├── main.py
└── mylib
├── __init__.py
└── function1.py
└── function2.py
あとはpip install mylibで仮想環境に自作ライブラリをインストールし、
pip install pyinstallerでpyinstallerをインストールして
pyinstaller main.py --onefile
でmain.pyをexe化すれば完了。
とりあえず手元では動いている。
mylibの名前を変えても動作したので自作ライブラリはexeファイルに同梱されたと思う。
まだまだ勉強不足だが、関数、モジュール、パッケージ、ライブラリの違いについてなんとなくこうかな?という感じの理解だったのがだいぶ改善されたと思う。
しかし、orenolibがライブラリなのか、mylibがライブラリなのか判然としない…
setup.pyでバージョンを指定すると、mylibがそのバージョンでインストールされるのでmylibはインストールされているらしい。ライブラリを参照し、その中身のmylibというパッケージをインストールしている?このあたりの機微は肌感覚ではつかめていない。
Pythonチュートリアルには自作ライブラリの参照方法は載っていなさそうだった。
仮想環境からはちゃんとexitで抜け、.venvも作りっぱなしにせずちゃんと消しておくのが大事。
.venvが大量に残っていると、仮想環境にインストールしたつもりのライブラリがインストールできておらず、過去に他のフォルダで作成した.venvにある想定外のライブラリやモジュールが同梱されてしまう。
他にも色々(特にsetup.py関連で)あるらしいが、自作ライブラリをPyPIやGitに公開する予定は無いので当面は大丈夫だろう。
趣味として自作ライブラリを作成し、PyPIに上げたりGitで管理したりするのはべんきょうになるかもしれ