咱们先盘盘,你面前有哪几条路?

发布时间:2026/7/11 8:02:57
咱们先盘盘,你面前有哪几条路? 方式一PyInstaller (粗暴打包流) 比喻 把整个家当塞进一个集装箱里拖到地方直接开箱。 优点 一个文件夹走天下不需要目标机器装Python。 痛点 极其容易漏掉隐式依赖踩坑率极高。 方式二虚拟环境 源码拷贝 (原生依赖流) 比喻 只搬家具过去到了新家再按照清单requirements.txt现买锅碗瓢盆。 优点 最稳体积小兼容性最好。 痛点 目标机器必须有Python环境。 方式三Docker 容器化 (拎包入住流) 比喻 直接把整个旧房间的布局和家具克隆过去连墙纸都一样。 优点 环境完全隔离Linux下部署的首选方案。 痛点 Windows下依赖虚拟化有点重且图形化交互麻烦。 Linux 环境下听我一句劝别折腾直接容器化在Linux下真的信我无脑选 Docker。你别看PyInstaller能打包成单个文件很诱人但在Linux生态里那真是自找麻烦。 Docker 实操把大象装进冰箱分三步第一步编写 Dockerfile别一上来就找网上的烂大街模板。这里有一点要特别注意requirements.txt 里千万别忘了写死 uvicorn[standard]否则进容器跑起来你会发现性能怎么这么拉胯就是因为缺了那几个 C 扩展。用slim镜像体积小安全漏洞少FROM python:3.14-slim-bookwormWORKDIR /app先复制依赖文件利用Docker缓存层不用每次都重装COPY requirements.txt .RUN pip install --no-cache-dir -r requirements.txt再把代码丢进去COPY . .重点用字符串形式启动不然信号传递会有问题CMD [“uvicorn”, “main:app”, “–host”, “0.0.0.0”, “–port”, “80”]第二步构建并运行你说“这命令我都会有啥好讲的”嘿还真有。挂载卷的时候尽量用绝对路径。特别是配合一些CI/CD工具时相对路径经常导致挂载了个寂寞。docker build -t my-fastapi-app .docker run -d -p 8080:80 --name my-app my-fastapi-app第三步善用 docker-compose如果涉及数据库或者Redis别用那个长长的 docker run 指令了维护性太差。写个 docker-compose.yml谁看了不夸一句清爽 Windows 环境下在现实的泥潭里优雅地扑腾Windows 服务器往往是企业内网的“硬骨头”。不能装 Docker Desktop因为要开Hyper-V很多虚机不支持甚至不给装 Python。这时候PyInstaller 硬着头皮也得上但我带你避开那些巨坑。 PyInstaller 避坑指南官方文档虽然没写那么细但根据以往的经验你绝对不能直接 pyinstaller main.py这么做生成的包要么启动闪退要么找不到 uvicorn 的二进制依赖。正确姿势使用 Spec 文件进行精细化控制。第一步生成 Spec 文件pyinstaller --name myapp --onedir main.py注意是 --onedir 不是 --onefile为什么不用 --onefile因为单文件运行时每次都要解压到临时目录对于 FastAPI 这种需要频繁 IO 的子进程应用启动慢不说杀毒软件还经常误以为你是病毒给拦下来血泪教训。第二步修改 myapp.spec 文件这个步骤最考验耐心。咱们要手动把隐式依赖揪出来。-- mode: python ; coding: utf-8 --a Analysis([main.py], pathex[], binaries[], # 重点来了这里要补上 uvicorn 的隐式依赖 hiddenimports[ uvicorn.logging, uvicorn.loops.auto, uvicorn.protocols.http.auto, fastapi.encoders, ], ...)pyz PYZ(a.pure)exe EXE(pyz, …)第三步重新打包pyinstaller myapp.spec打包完后去 dist/myapp 目录下找你的 myapp.exe把它和整个文件夹一起拷走。 原生环境 NSSM如果你能装 Python那我就更推荐你用原生环境 NSSM (Non-Sucking Service Manager) 把 FastAPI 注册成 Windows 服务。是不是以为刚才 Docker 那种跑法就够稳了在 Windows 生产环境里你如果只是双击 exe 或者开个 CMD 窗口万一谁手贱把窗口关了服务就挂了。这时候就该 NSSM 出场了nssm install MyFastAPI “C:\Python311\Scripts\uvicorn.exe”nssm set MyFastAPI AppParameters “main:app --host 0.0.0.0 --port 8080”nssm start MyFastAPI这样它就在后台像个小强一样顽强地活着崩溃了还能自动重启。 最后的抉择我该怎么选说到这里咱们来划个重点。选择恐惧症的同学看这里 场景A我有 Linux 服务器能联网。 冲 Docker。别想了这是工程上的最佳实践。 场景B我有 Linux 服务器但完全离线涉密内网。 用 Docker save/load。先在有网机器上 docker save -o app.tar my-app:latest然后U盘拷过去 docker load -i app.tar这也比 PyInstaller 香得多。 场景CWindows 服务器不能装 Python不能开虚拟机。 上 PyInstaller。记住我踩的坑去改 Spec 文件用 --onedir 模式。 场景DWindows 服务器能装 Python想当服务跑。 NSSM 虚拟环境。这是 Windows 下最接近“优雅”二字的方案了。其实工具的选择就是这么个理儿没有银弹只有场景适配。不要为了炫技去用 Docker也不要因为怕麻烦就在 Windows 下死磕 PyInstaller。好了今天掏心窝子分享的这些打包部署的野路子希望能帮你把那句“我在我电脑上是好的啊”这口锅彻底甩掉。如果这篇文章让你少踩了几个坑记得点赞、收藏、加关注三连走起毕竟不知道哪天又会被哪个刁钻的客户环境给困住到时候可别找不到我的人。