news 2026/4/16 14:52:30

【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/4/16 11:10:01

Llama Factory微调竞赛:如何在有限资源下获得最佳效果

Llama Factory微调竞赛:如何在有限资源下获得最佳效果 前言:为什么选择 Llama Factory? 最近参加了一个AI竞赛,需要在有限的计算资源和时间内完成大模型微调任务。经过实战摸索,我发现 Llama Factory 这个工具链特别适…

作者头像 李华
网站建设 2026/4/16 11:03:00

电商平台如何利用Kafka工具构建实时订单系统

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 设计一个电商实时订单处理系统,使用Kafka作为消息中间件。要求包含:1. 订单创建生产者 2. 库存服务消费者 3. 支付服务消费者 4. 通知服务消费者。每个服务…

作者头像 李华
网站建设 2026/4/16 9:09:12

Legado阅读器广告过滤终极指南:3步打造无干扰阅读体验

Legado阅读器广告过滤终极指南:3步打造无干扰阅读体验 【免费下载链接】legado Legado 3.0 Book Reader with powerful controls & full functions❤️阅读3.0, 阅读是一款可以自定义来源阅读网络内容的工具,为广大网络文学爱好者提供一种方便、快捷…

作者头像 李华
网站建设 2026/4/16 14:27:25

AFFiNE多语言协作平台:25种语言支持的终极团队协作方案

AFFiNE多语言协作平台:25种语言支持的终极团队协作方案 【免费下载链接】AFFiNE AFFiNE 是一个开源、一体化的工作区和操作系统,适用于组装您的知识库等的所有构建块 - 维基、知识管理、演示和数字资产。它是 Notion 和 Miro 的更好替代品。 项目地址:…

作者头像 李华
网站建设 2026/4/16 11:08:43

VS Code主题优化指南:让编码速度提升30%

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个VS Code主题效率分析工具,功能包括:1. 眼动追踪模拟测试 2. 代码识别速度评估 3. 疲劳度预测模型 4. 基于AI的优化建议 5. 生成效率报告。使用Kimi…

作者头像 李华
网站建设 2026/4/16 9:47:25

Llama Factory可视化指南:不用命令行也能轻松微调模型

Llama Factory可视化指南:不用命令行也能轻松微调模型 作为一名UI设计师,你是否曾想过将AI融入创作流程,却被复杂的命令行操作劝退?现在,通过Llama Factory的可视化界面,你可以像使用设计软件一样轻松调整模…

作者头像 李华