如何从单个.spec文件创建多个可执行文件?

时间:2019-11-25 10:10:07

标签: pyinstaller

我有一个程序想要分发给多个客户,但要使用他们自己的名称和徽标以及不同的模式。每个客户需要3个不同的文件,如果我有20个客户,则需要60个规格文件。我试图创建一个.spec文件,该文件将以1次编译的方式全部创建,但它只会覆盖相同的文件,而我最终得到1个文件。

是否可以仅使用1个.spec文件从一个.py中使用PyInstaller创建多个可执行文件?

我尝试用所有EXE,PYZ等创建一个列表,但仍然只创建了1个可执行文件。在创建后的“ build”文件夹中,我可以看到多个具有不同名称的.toc .pyz .pkg。 00,01,02,依此类推。似乎可以做到这一点,但我缺少了一些东西。

我在做什么错了?

我正在使用Python 3.6和PyInstaller 3.5。

# -*- mode: python -*-
import glob
import os
import sys

block_cipher = None

companies_to_create = ["CustomerA", "CustomerB"]
modes = ["config", "service"]

# Testing list, static
list_PYZ = [None] * 4
list_EXE = [None] * 4
list_A = [None] * 4
app_nr = 0


for company in companies_to_create: 

  for mode in modes:

    # Changes mode in file to create
    with open("mainprogram/mode.py", "w") as f_mode:
      f_mode.write('mode="' + mode + '"')
    f_mode.close()

    # Changes company in file to create
    with open("mainprogram/company.py", "w") as f_company:
      f_company.write('company="' + company + '"')
    f_company.close()

    from PyInstaller.utils.hooks import collect_submodules, collect_data_files
    from mainprogram.brands import company_app

    hiddenimports = collect_submodules('pubsub')

    list_A[app_nr] = Analysis(['mainprogram/mainprogram.py'],
                pathex=[],
                binaries=[],
                hiddenimports=hiddenimports,
                hookspath=[],
                runtime_hooks=[],
                excludes=['tkinter'],
                win_no_prefer_redirects=False,
                win_private_assemblies=False,
                cipher=block_cipher)

    images = glob.glob("mainprogram/images/**/*", recursive=True)
    icons = glob.glob("mainprogram/icons/**/*", recursive=True)
    files = images + icons

    for f in files:
      if os.path.isfile(f):
        path = f.split('mainprogram/')[1]
        list_A[app_nr].datas += [((path, f, 'Data'))]


    list_PYZ[app_nr] = PYZ(list_A[app_nr].pure, list_A[app_nr].zipped_data, cipher=block_cipher)
    list_EXE[app_nr] = EXE(list_PYZ[app_nr],
              list_A[app_nr].scripts,
              list_A[app_nr].binaries,
              list_A[app_nr].zipfiles,
              list_A[app_nr].datas,
              name=company_app.exe_name,
              debug=False,
              strip=False,
              upx=False,
              console=False,
              icon='mainprogram/icons/' + company + '.ico')

    app_nr += 1    

0 个答案:

没有答案