PyInstallerで1つのフォルダに複数のexeを作成する

公開日:  

python pyinstaller


PyInstallerを使えば簡単にexeを作成できますが、1つのフォルダに複数のexeを作るにはどうすればよいのか分からなかったので調べてみました。

1つのフォルダに複数のexeを作る

1つのフォルダに複数のexeを作る

環境

  • Windows 10
  • Python 3.9.0
  • PyInstaller 4.5

方法

1. pythonファイルの用意

適当にサンプルとなるpythonファイルを用意します。

今回は以下のhello1.pyhello2.pyを使います。

# hello1.py
#
print('hello 1')
# hello2.py
#
print('hello 2')

2. それぞれのspecファイルを作成

hello1.pyhello2.pyの両方のspecファイルを作成します。

以下を実行するとhello1.spechello2.specというファイルが作られます。

pyi-makespec hello1.py
pyi-makespec hello2.py

pyi-makespecはPyInstallerをインストールすると一緒に入っています。

specファイルを開いてみると以下のような内容になっていると思います(長いので一部省略しています)。
中身は実際にはpythonコードです。

# hello1.spec
...

a = Analysis(['hello1.py'], ...)
pyz = PYZ(a.pure, a.zipped_data, ...)

exe = EXE(pyz,
          a.scripts, 
          ... )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas, 
               ...)

PyInstallerはspecファイルの内容を元にしてアプリをビルドします。
このspecファイルをうまい具合に修正することで、「1つのフォルダに複数のexeを作る」ことができます。

3. 2つのspecファイルを合わせて1つのspecファイルを作成

hello1.spechello2.specの内容を合体して1つのspecファイルを作成します。

hello.specというファイルを作成し、2つのspecファイルを元にしながら以下のように記述します。

# hello.spec
...

hello1_a = Analysis(['hello1.py'], ...)
hello1_pyz = PYZ(hello1_a.pure, hello1_a.zipped_data, ...)
hello1_exe = EXE(hello1_pyz,
          hello1_a.scripts, 
          ...)

hello2_a = Analysis(['hello2.py'], ...)
hello2_pyz = PYZ(hello2_a.pure, hello2_a.zipped_data, ...)
hello2_exe = EXE(hello2_pyz,
          hello2_a.scripts, 
          ...)

coll = COLLECT(hello1_exe,
               hello1_a.binaries,
               hello1_a.zipfiles,
               hello1_a.datas,
               hello2_exe,
               hello2_a.binaries,
               hello2_a.zipfiles,
               hello2_a.datas,
               ...
               name='hello')

AnalysisPYZEXEの部分をコピペし、変数名を互いに被らないように修正します。
COLLECTの部分もコピペしますが、1つだけにして引数を変更します。

4. PyInstallerの実行

 pyinstaller hello.spec

実行が完了すると、distフォルダ以下にhelloというフォルダが作成され、その中にhello1.exeとhello2.exeが作成されます。



関連記事