89 lines
3.0 KiB
Python
89 lines
3.0 KiB
Python
|
|
import os
|
|||
|
|
import shutil
|
|||
|
|
import subprocess
|
|||
|
|
import sys
|
|||
|
|
|
|||
|
|
def main():
|
|||
|
|
# 1. 定义路径
|
|||
|
|
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
|||
|
|
DIST_DIR = os.path.join(BASE_DIR, 'dist')
|
|||
|
|
APP_NAME = 'runDecoder'
|
|||
|
|
TARGET_DIR = os.path.join(DIST_DIR, APP_NAME)
|
|||
|
|
|
|||
|
|
# 定义需要复制的资源 {源路径: 目标子路径}
|
|||
|
|
# 目标子路径相对于 TARGET_DIR
|
|||
|
|
RESOURCES = {
|
|||
|
|
'config.ini': 'config.ini',
|
|||
|
|
'online_Models': 'online_Models',
|
|||
|
|
'Tools': 'Tools',
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 2. 清理旧构建
|
|||
|
|
print("[1/3] Cleaning up old builds...")
|
|||
|
|
if os.path.exists(DIST_DIR):
|
|||
|
|
try:
|
|||
|
|
shutil.rmtree(DIST_DIR)
|
|||
|
|
print(" Cleaned dist/")
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f" Warning: Could not clean dist/: {e}")
|
|||
|
|
|
|||
|
|
BUILD_DIR = os.path.join(BASE_DIR, 'build')
|
|||
|
|
if os.path.exists(BUILD_DIR):
|
|||
|
|
try:
|
|||
|
|
shutil.rmtree(BUILD_DIR)
|
|||
|
|
print(" Cleaned build/")
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f" Warning: Could not clean build/: {e}")
|
|||
|
|
|
|||
|
|
# 3. 运行 PyInstaller
|
|||
|
|
print("[2/3] Running PyInstaller...")
|
|||
|
|
# 注意:我们这里不传 --noupx,因为已经在 spec 文件里把 upx=False 写死了
|
|||
|
|
cmd = [
|
|||
|
|
"pyinstaller",
|
|||
|
|
"build_algorithm.spec",
|
|||
|
|
"--clean"
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
subprocess.check_call(cmd, shell=True)
|
|||
|
|
except subprocess.CalledProcessError:
|
|||
|
|
print("Error: PyInstaller failed.")
|
|||
|
|
sys.exit(1)
|
|||
|
|
|
|||
|
|
# 4. 复制外部资源文件夹
|
|||
|
|
print("[3/3] Verifying and Copying external resources...")
|
|||
|
|
|
|||
|
|
for src_name, dst_name in RESOURCES.items():
|
|||
|
|
src_path = os.path.join(BASE_DIR, src_name)
|
|||
|
|
dst_path = os.path.join(TARGET_DIR, dst_name)
|
|||
|
|
|
|||
|
|
if os.path.exists(src_path):
|
|||
|
|
if os.path.isfile(src_path):
|
|||
|
|
# 如果是文件
|
|||
|
|
try:
|
|||
|
|
shutil.copy2(src_path, dst_path)
|
|||
|
|
print(f" Copied file: {src_name} -> {dst_name}")
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f" Error copying file {src_name}: {e}")
|
|||
|
|
else:
|
|||
|
|
# 如果是文件夹
|
|||
|
|
if os.path.exists(dst_path):
|
|||
|
|
try:
|
|||
|
|
shutil.rmtree(dst_path) # 先删除 spec 生成的旧文件夹 (如果有)
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f" Warning: Could not remove existing dir {dst_path}: {e}")
|
|||
|
|
try:
|
|||
|
|
shutil.copytree(src_path, dst_path, ignore=shutil.ignore_patterns('*.pyc', '__pycache__'))
|
|||
|
|
print(f" Copied dir: {src_name} -> {dst_name}")
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f" Error copying dir {src_name}: {e}")
|
|||
|
|
else:
|
|||
|
|
print(f" Warning: Source resource not found at {src_path}")
|
|||
|
|
|
|||
|
|
print("\n" + "="*50)
|
|||
|
|
print(f"SUCCESS! Build artifacts are in: {TARGET_DIR}")
|
|||
|
|
print("="*50)
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
main()
|