news 2026/6/7 13:07:49

【FASTAPI+UNICORN】带着依赖包整体打包部署到无依赖库环境

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【FASTAPI+UNICORN】带着依赖包整体打包部署到无依赖库环境

打包

安装最新版PyInstaller

pip3install--upgrade pyinstaller

修改 main.py 适配打包路径

打包后程序的运行目录会变化(PyInstaller 会创建临时目录_MEIPASS),必须修改main.py中所有硬编码路径,确保能找到静态文件、配置文件等资源。

# -------------------------- PyInstaller 路径适配核心函数 --------------------------defget_resource_path(relative_path):""" 获取打包后资源的真实路径(适配PyInstaller) - 开发环境:返回项目根目录相对路径 - 打包后:返回PyInstaller临时目录(_MEIPASS)中的路径 """ifhasattr(sys,'_MEIPASS'):# 打包后运行模式base_path=Path(sys._MEIPASS)else:# 开发环境运行模式base_path=Path(os.path.abspath("."))returnstr(base_path/relative_path)

创建定制化 Spec 文件

  1. 生成基础 Spec 文件:

    pyinstaller -F --name video_surveillance main.py

    执行后会生成video_surveillance.spec文件。

  2. 替换为定制化 Spec 文件

  3. 将生成的video_surveillance.spec内容替换为以下完整配置

    upx github下载 或者官网

    # -*- mode: python ; coding: utf-8 -*-importosimportsys from pathlibimportPath# -------------------------- 基础配置 --------------------------# 获取当前Spec文件所在目录#current_dir = Path(__file__).parent# -------------------------- 修复__file__未定义问题 --------------------------# 兼容PyInstaller执行Spec文件时的上下文,获取当前Spec文件所在目录def get_spec_dir():if'__file__'inglobals():returnPath(__file__).parent else:# 备用方案:从命令行参数中提取Spec文件路径forarginsys.argv:ifarg.endswith('.spec')and os.path.exists(arg):returnPath(arg).parent# 最终备用:当前工作目录returnPath(os.getcwd())# 获取当前Spec文件所在目录(修复核心)current_dir=get_spec_dir()# 定义需要打包的资源(格式:(源路径, 目标路径))# 目标路径是打包后程序内部的相对路径,需和main.py中的get_resource_path对应# -------------------------- 资源列表(关键) --------------------------# 1. 静态文件:打包整个static目录(包含所有子目录和文件)static_dir=current_dir /"static"# 2. 配置文件:打包config目录config_dir=current_dir /"config"# 最终打包资源列表datas=[(str(static_dir),"static"),# 静态文件目录(完整打包)(str(config_dir),"config"),# 配置文件目录]# -------------------------- 隐藏依赖(解决动态导入问题) --------------------------hidden_imports=[# Uvicorn/FastAPI核心依赖"uvicorn.lifespan","uvicorn.lifespan.on","uvicorn.protocols.websockets.auto","uvicorn.protocols.http.auto","uvicorn.protocols.http.h11_impl","uvicorn.protocols.websockets.websockets_impl",# WebSocket依赖"websockets",# FastAPI依赖"fastapi.routing","fastapi.dependencies","fastapi.staticfiles","fastapi.responses",# 其他依赖"python_multipart","pydantic","starlette","starlette.websockets","starlette.responses",# 通用ARM64必需依赖"h11","typing_extensions",]# -------------------------- 打包配置 --------------------------block_cipher=None a=Analysis(['main.py'],# 主程序入口pathex=[str(current_dir)],# 项目根目录binaries=[],# 二进制文件(自动识别)datas=datas,# 静态资源hiddenimports=hidden_imports,# 隐藏依赖hookspath=[],hooksconfig={},runtime_hooks=[],excludes=['tkinter','matplotlib','numpy','pandas'],# 排除无用依赖减小体积win_no_prefer_redirects=False,win_private_assemblies=False,cipher=block_cipher,noarchive=False,)pyz=PYZ(a.pure, a.zipped_data,cipher=block_cipher)# -------------------------- 可执行文件配置 --------------------------use_upx=Falseifsys.platform=="win32"and sys.maxsize>2**32:# 仅Windows x64启用UPXuse_upx=True exe=EXE(pyz, a.scripts, a.binaries, a.zipfiles, a.datas,[],name='video_surveillance',# 可执行文件名称debug=False,# 关闭调试模式 仅关闭 PyInstaller 底层的调试日志,不影响代码中的任何打印 / 日志:bootloader_ignore_signals=False,strip=False,upx=use_upx,# 压缩可执行文件(需安装UPX,可选)能 有极轻微的启动延迟(毫秒级),运行中无任何性能损失:upx_exclude=[],runtime_tmpdir=None,console=True,# 保留控制台窗口(方便查看日志)disable_windowed_traceback=False,argv_emulation=False,target_arch=None,codesign_identity=None,entitlements_file=None,)# Windows额外配置(可选)ifsys.platform=="win32":exe=EXE(pyz, a.scripts, a.binaries, a.zipfiles, a.datas,[],name='video_surveillance',debug=False,bootloader_ignore_signals=False,strip=False,upx=use_upx,upx_exclude=[],runtime_tmpdir=None,console=True,# 如需隐藏控制台,改为 windowed=Truedisable_windowed_traceback=False,argv_emulation=False,target_arch=None,codesign_identity=None,entitlements_file=None,)
  4. 执行打包

    pyinstaller video_surveillance.spec
  5. 重新打包

    # 先清理旧的打包产物(可选,避免缓存问题)rm-rf build dist __pycache__# 重新执行打包pyinstaller video_surveillance.spec
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/28 22:01:55

Llama Factory魔法:让基础模型学会说行业黑话

Llama Factory魔法:让基础模型学会说行业黑话 作为一名金融分析师,你是否遇到过这样的困扰:通用大模型虽然能回答日常问题,但面对"量化宽松""黑天鹅事件""阿尔法收益"等专业术语时,要么…

作者头像 李华
网站建设 2026/5/28 20:14:53

Stable Diffusion WebUI实战教程:从零精通AI图像生成技术

Stable Diffusion WebUI实战教程:从零精通AI图像生成技术 【免费下载链接】stable-diffusion-webui AUTOMATIC1111/stable-diffusion-webui - 一个为Stable Diffusion模型提供的Web界面,使用Gradio库实现,允许用户通过Web界面使用Stable Diff…

作者头像 李华
网站建设 2026/6/4 20:48:33

Llama Factory高效微调:节省90%时间的终极方案

Llama Factory高效微调:节省90%时间的终极方案 作为一名经常需要微调大模型的开发者,我深知本地环境配置的繁琐和耗时。从CUDA版本冲突到依赖包安装失败,每一步都可能成为拦路虎。直到我发现了Llama Factory这个开源低代码微调框架&#xff0…

作者头像 李华
网站建设 2026/6/6 17:05:22

AI一键解决Visual C++依赖问题:快马平台实战

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个Python项目配置脚本,自动检测系统是否安装Visual C 14.0或更高版本。如果未安装,则提供三种解决方案:1) 自动下载官方Microsoft C安装包…

作者头像 李华
网站建设 2026/5/28 23:50:27

Llama Factory微调全流程优化:从环境搭建到模型部署

Llama Factory微调全流程优化:从环境搭建到模型部署 作为一名效率至上的工程师,我一直在寻找能够优化AI开发全流程的解决方案。最近在实际项目中,我通过Llama Factory完成了从大模型微调到部署的全流程实践,实测下来这套工具链能显…

作者头像 李华
网站建设 2026/5/31 11:18:08

Verl分布式训练中的NCCL通信故障排查与优化指南

Verl分布式训练中的NCCL通信故障排查与优化指南 【免费下载链接】verl verl: Volcano Engine Reinforcement Learning for LLMs 项目地址: https://gitcode.com/GitHub_Trending/ve/verl 在Verl(火山引擎大语言模型强化学习)平台的分布式训练实践…

作者头像 李华