AI 生成的 requirements.txt 害我部署搞了一上午。。

520 阅读3分钟

别盲目相信 AI 给你生成的 requirements.txt 。 它看起来像是帮你总结好了所有依赖,实际上准确率堪忧,经常会出现版本对不上、根本不存在的库,或者和你的 Python 版本完全不兼容。亲身实测,这玩意充其量是一个参考,而不是可以直接用在生产环境的配置文件。这是踩过坑之后换来的血的经验。

📜 前情提要

今天原本只是一次简单的部署更新,没想到硬生生搞成了一次完整的实战修炼。

项目是一个前后端分离的智能稽核平台,前端基于 Vue3,后端是 Python Flask + OpenAI API。目标很简单:把本地开发好的代码部署到服务器上,让前端能正常调用后端 API。

听起来是不是很简单?对,听起来。

🚑 第一波崩溃:API 全线扑街,但图片能访问

部署完成,前端一打开页面,所有的 API 请求直接扑街:

500 Internal Server Error

但是,很诡异——访问后端的图片是正常的。

这一下直接说明了一个事实:

  • ✅ 静态文件服务正常(Flask 的 static/ 文件夹在工作)。
  • ❌ 动态 API 全部挂掉(/api/*、/send_email、/parse_excel、/ask_to_json 全报500)。

我瞬间明白,这绝对不是端口、防火墙或者前后端没连通的问题。因为图片是从后端接口直接返回的,说明网络是通的、Nginx(如果有的话)是通的,CORS 也是通的。

🔥 问题的本质一定在 Flask 的动态路由服务启动失败

🕳️ 第二波深坑:Python 版本地狱

原来服务器默认 Python 是 3.7.9。

我看着 requirements.txt 里的 Flask==2.3.3,瞬间明白了。

✅ Flask 2.2 开始,最低支持 Python 3.8。 —— 这个是 AI 自动生成的,它也想不到,还有低于 3.8 的环境的吧??

直接装不上,pip 一顿狂报错:

ERROR: No matching distribution found for Flask==2.3.3

💡 行吧,Python 升级走起。

🔥 第三波对抗:pip 和路径的迷宫

Python 3.10 装完了,结果 pip 还默认指向老的 Python 3.7。

查 pip 路径,试图软链接、换源、改 PATH,所有能想到的招都上了。

不是权限问题,就是 pip 和 python 对不上,装的库永远在“平行世界”。

一度开始怀疑人生: “为什么 pip install 明明显示成功,python 一运行还在报 ModuleNotFoundError?”

🧠 第四波顿悟:虚拟环境才是真理

彻底放弃全局安装,直接项目内建一个 venv:

python3.10 -m venv venv
source venv/bin/activate
pip install -r requirements.txt

结果——openai 又报错。

原因?AI帮我生成的 requirements.txt 里写着:

openai==0.2.3

什么鬼?直接 pip 官方都搜不到。

💥 瞬间明白:AI生成的requirements.txt 纯粹是“编的”,根本没测试过版本兼容。

🔧 第五波修正:全手动修复依赖

彻底不信 requirements.txt 了,直接上最原始的办法:

1️⃣ 本地跑得好的环境,pip freeze 导出:

pip freeze > requirements.txt

2️⃣ 上传到服务器,重新安装:

pip install -r requirements.txt

openai、flask、pandas、gunicorn,一个一个确认版本。

✅ 第六波成功:见证重启

杀掉占用的5000端口:

kill -9 $(lsof -t -i :5000)

启动服务:

source venv/bin/activate
gunicorn app:app -b 0.0.0.0:5000

前端刷新页面——所有API正常返回!

✅ 三个小时的地狱,终于走到了出口。

🚀 成长的瞬间

这次部署,带给我的绝不仅仅是“跑通了”这么简单。

✅ 深刻理解了 Python 多版本管理的地狱
✅ 明白了 requirements.txt 永远只是个历史快照,别全信
✅ 再也不手动改 PATH,虚拟环境永远是最优解
✅ openai 这种库更新太快,AI生成的依赖版本根本靠不住

最重要的是,彻底习得一条原则:

“部署,永远不是点击 run 那么简单。”

🏗️ 最后,附上部署代码,作为教训

cd py
source venv/bin/activate

# 杀掉5000端口
PID=$(lsof -t -i :5000)
if [ "$PID" ]; then
  kill -9 $PID
fi

# 启动
nohup gunicorn app:app -b 0.0.0.0:5000 > server.log 2>&1 &

后端启动完成 ✅