我有一个程序想要分发给多个客户,但要使用他们自己的名称和徽标以及不同的模式。每个客户需要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