
PyInstaller
付加コマンド
--onefile
最終的に吐き出されるファイルを、1つのexeファイルにバンドルする。
副作用として、
- コマンド終了までの処理時間が長くなる。
- exeファイルの起動までの動作が重たくなる。
等が挙げられる。
--noconsole
exeファイルの起動時に黒いコンソールを出現させなくする。
GUIを作っている場合など、コンソールでの情報表示が不要な場合に利用。
--add-data
png、jpg、ico、など各種画像ファイル、その他の非バイナリファイルをバンドルするためのコマンド。
specファイルを編集する方法もあるが、それはそれで色々面倒なので、ファイルが少なければコマンドで指定が楽。
--add-data <現在のファイルパス>;<バンドル後のファイルパス>
区切りにはセミコロンを使う。
プログラムのソースから参照している位置がずれない様に注意が必要。
色々考えるのが面倒なら直下配置 " . " をdist_pathに指定するのが無難。
使用例:
0 1 2 | PyInstaller --add-data .\\icon1.png;. --add-data .\\icon2.png;. |
GUIを作ってexe化した場合など、iconなどを使っている場合でも、標準の動作では画像ファイルはバンドルされない。
そのままでは配布時に画像ファイルも別途合わせて配布ZIPに織り込む必要があるので、--add-dataを使ってexeファイルにバンドルする方が見栄えが良い。
--onefileを指定して画像をバンドルしたい場合は、
0 1 2 3 4 5 6 7 8 | import sys from pathlib import Path def resource_path(relative_path): base_path = getattr(sys, '_MEIPASS', str(Path(__file__).absolute().parent)) return str(Path(base_path).joinpath(relative_path)) |
--onefileを指定した場合、スクリプトで画像などのリソースを読み込む際は、この関数に通して読み込む。
PyQtでアイコンを読み込む場合の例は以下の例のようにresource_path関数を通す必要がある。
0 1 2 3 4 5 6 7 8 9 | class MainWindow(QtWidgets.QMainWindow): signalStatus = pyqtSignal(str) def __init__(self, parent=None): super(self.__class__, self).__init__(parent) self.ui = Ui_MainWindow() self.setWindowIcon(QIcon(resource_path('icon.png'))) |