# Windows py2exe build script # running: python3 setup.py py2exe import os import sys import traceback # noinspection PyUnresolvedReferences import py2exe import importlib from distutils.core import setup from glob import glob sys.argv.append("py2exe") PYTHON_PATH = r"C:\Python311" WINDOWS_PATH = r"C:\Windows" SETUP_DICT = { "console": [{ "script": "speedtest.py", "icon_resources": [(1, "resources/speedometer.ico")], "dest_base": "Speedtest" }], "zipfile": "lib/library.zip", "data_files": [ ("", glob(os.path.join(WINDOWS_PATH, r"SYSTEM32\msvcp100.dll"))), ("", glob(os.path.join(WINDOWS_PATH, r"SYSTEM32\msvcr100.dll"))), ("", glob(os.path.join(os.getcwd(), r"speedtest.ini"))), ("", glob(os.path.join(os.getcwd(), r"urls.txt"))), ("library", glob(os.path.join(os.getcwd(), r"library/commons.py"))), ("library", glob(os.path.join(os.getcwd(), r"library/inputimeout.py"))), ], "options": { "py2exe": { "bundle_files": 3, "includes": ["charset_normalizer"], "excludes": ["tcl", "tk", "tkinter", "lib2to3", "xmlrpc", "multiprocessing", "asyncio", "pydoc_data", "unittest", "pydoc", "lzma", "bz2"], "dll_excludes": ["tcl86.dll", "tk86.dll"], "compressed": True, "optimize": 2 }, }, # fix for conflicting module dirs "py_modules": [], } # Check if all files can be found for num, file in enumerate(SETUP_DICT["data_files"]): type_, file = file if len(file) > 0: file = file[0] if os.path.exists(file): print("Found file:", file) else: print("File not found:", file) sys.exit(-1) else: if type_: print("Data file of type", type_, "not found") else: print("Data file with index", num, "and name", file, "not found") sys.exit(-1) try: setup(**SETUP_DICT) except Exception: traceback.print_exc() os.system("pause") else: # DDLs / exe files that are safe to be compressed with UPX OPTIMIZE = [glob(r"dist\python311.dll"), glob("dist\adb.exe"), glob(r"dist\lib\Qt*"), glob(r"dist\lib\*.pyd"), glob(r"dist\lib\libcrypto-1_1.dll"), glob(r"dist\lib\libssl-1_1.dll")] if os.path.exists("dist") and os.path.exists("upx.exe"): for files in OPTIMIZE: for file in files: if os.path.exists(file): # todo use subprocessing to run UPX on ALL CPU cores os.system("upx --best %s" % file) else: print("Warning: not going to optimize dist size because upx.exe doesn't exist\n") print("Please put upx.exe next to setup.py in order to have the build reduced in size by ~50%") os.system("pause")