# -*- mode: python ; coding: utf-8 -*- """ PyInstaller spec file for AI 学术写作助手 用于将前后端项目打包为单个可执行文件 """ import os import sys from PyInstaller.utils.hooks import collect_submodules, collect_data_files # 获取 spec 文件所在目录 spec_dir = os.path.dirname(os.path.abspath(SPEC)) # 收集所需的隐式导入 hidden_imports = [ 'uvicorn.logging', 'uvicorn.loops', 'uvicorn.loops.auto', 'uvicorn.protocols', 'uvicorn.protocols.http', 'uvicorn.protocols.http.auto', 'uvicorn.protocols.websockets', 'uvicorn.protocols.websockets.auto', 'uvicorn.lifespan', 'uvicorn.lifespan.on', 'uvicorn.lifespan.off', 'httptools', 'websockets', 'sqlalchemy.dialects.sqlite', 'pydantic', 'pydantic_settings', 'passlib.handlers.bcrypt', 'jose', 'openai', 'httpx', 'aiofiles', 'sse_starlette', 'redis', 'dotenv', # Word 格式化模块依赖 'mistune', 'docx', 'lxml', 'lxml.etree', 'lxml._elementpath', ] # 收集 uvicorn 和其他依赖的子模块 hidden_imports += collect_submodules('uvicorn') hidden_imports += collect_submodules('sqlalchemy') hidden_imports += collect_submodules('pydantic') hidden_imports += collect_submodules('pydantic_settings') hidden_imports += collect_submodules('fastapi') hidden_imports += collect_submodules('starlette') # Word 格式化模块子模块 hidden_imports += collect_submodules('mistune') hidden_imports += collect_submodules('docx') hidden_imports += collect_submodules('lxml') # 分析主入口文件 a = Analysis( ['main.py'], pathex=[spec_dir, os.path.join(spec_dir, 'backend')], binaries=[], datas=[ # 包含前端静态文件 ('static', 'static'), # 包含后端 app 目录 ('backend/app', 'app'), ], hiddenimports=hidden_imports, hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[ 'tkinter', 'matplotlib', 'numpy', 'pandas', 'scipy', 'PIL', ], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=None, noarchive=False, ) # 创建 PYZ 归档 pyz = PYZ(a.pure, a.zipped_data, cipher=None) # 创建可执行文件 exe = EXE( pyz, a.scripts, a.binaries, a.zipfiles, a.datas, [], name='AI学术写作助手', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, console=True, # 设置为 True 以显示控制台窗口(可以看到日志) disable_windowed_traceback=False, argv_emulation=False, target_arch=None, codesign_identity=None, entitlements_file=None, icon=None, # 可以添加图标文件路径 )