夜雨聆风学习资料网

ARTICLE · 1286314

AI写的Python脚本,为什么换个环境就跑不起来?

AI写的Python脚本,为什么换个环境就跑不起来?

预计阅读:约 7 分钟

让 AI 把 CSV 转成 Excel,再把失败记录标红。代码拿到了,运行时却先冒出一句:缺少某个包。

我找了个叫 uv 的开源工具,让 AI 用一份模拟设备验收记录试了一遍:从缺包报错,到补齐依赖,再到换个隔离环境重跑。除了代码,还该留下什么?

脚本没少,缺的是它用的包

案例很小:12 条设备记录,两列分别是设备编号、PASS 或 FAIL。让 AI 写一个make_report.py,生成 Excel,把 FAIL 整行标红。

AI 用了openpyxl,一个读写 Excel 文件的 Python 库。输入数据和脚本由 AI 准备,运行后也让它检查结果。12 条数据是为这次演练构造的。

在没有装这个包的独立 Python 环境里运行,确实报错了:

ModuleNotFoundError: No module named 'openpyxl'

脚本里的import openpyxl只是说“我要用它”,不会顺手把它装好。

直接改用 uv 运行,没有声明依赖,一样报缺包。uv 不会看见 import 就替你猜该装什么。

把“要装什么”写进脚本

uv(https://github.com/astral-sh/uv)是 Astral 做的 Python 包和项目管理工具。这次只用它管理一个小脚本的运行环境,实测版本是 uv 0.12.7、Python 3.12.13,运行在 Mac 上。

Mac 上已有 Homebrew 的话,可以用brew install uv安装;其他系统看官方安装说明(https://docs.astral.sh/uv/getting-started/installation/)。

给已有脚本加依赖,用这一条:

uv add --script make_report.py --python 3.12 "openpyxl==3.1.5"

脚本顶部就多了几行注释:

# /// script# requires-python = ">=3.12"# dependencies = [#     "openpyxl==3.1.5",# ]# ///

意思很直接:这个脚本需要 Python 3.12 及以上,还需要指定版本的 openpyxl。

这种脚本内元数据(https://packaging.python.org/en/latest/specifications/inline-script-metadata/)可以让支持它的工具知道运行要求。uv 按声明准备独立环境,再执行脚本;普通python make_report.py不会因此自动装包,我补完注释后也试了,空环境里仍然报错。

这样保存脚本时,运行要求也跟着留下了。

跑通后,我又换了一个空环境

只指定 openpyxl 的版本还不够,它本身也依赖其他包。要把这次解析出来的版本一起留住,可以生成锁文件:

uv lock --script make_report.pyuv run --locked make_report.py devices.csv report.xlsx

第一条会生成make_report.py.lock;第二条里的--locked要求锁文件保持不变,需要更新就报错。具体规则见官方脚本指南(https://docs.astral.sh/uv/guides/scripts/)和命令说明(https://docs.astral.sh/uv/reference/cli/#uv-run--locked)。

这次生成的表格是 12 条记录,9 条通过、3 条失败。AI 重新读取 Excel,核对了每一条数据,以及 DEMO-003、DEMO-007、DEMO-011 这三行的标色。

随后只把脚本、锁文件和 CSV 复制到另一目录,用另一份空缓存重建环境。结果一致,锁文件内容也没变。

本次模拟数据的运行结果重排;两处环境均在同一台Mac上。

这验证的是同机隔离重跑,不是换电脑、换系统也一定能跑。

下次要用,至少能知道按什么版本、用什么输入、运行哪条命令。

下次给 AI,多提这一句

如果你也让 AI 写这种小工具,可以把交付要求说得具体一点:

请写一个把设备 CSV 转成 Excel 的 Python 脚本,输入列为 device_id 和 result,result 只接受 PASS/FAIL,失败行标红,已有输出文件不要覆盖。把 Python 要求和依赖写进脚本,生成锁文件,给出示例输入和运行命令。用隔离环境重跑,并核对输出数据与标色,不要只告诉我“运行成功”。

这次留下的东西也很少:make_report.py、同名的.py.lock、devices.csv,再加一句运行说明。接手的人要先装 uv,首次运行还可能要联网下载 Python 或依赖。

如果只是读写 CSV,Python 标准库就能做,不必为了用 uv 多塞一个包。本例需要 Excel 文件和单元格标色,才引入 openpyxl。

已经用 venv、pip 和 requirements 管好依赖,也不必重来。我觉得 uv 这个做法适合临时写出来、以后又想拿出来用的小脚本,运行要求就放在代码旁边。

文件路径、系统组件、跨平台差异,还有表格到底算得对不对,仍然需要检查。把包装上,只解决了其中一件事。

AI 写完代码以后,值得多问一句:下次不翻聊天记录,只看留下的文件,还能不能把它跑起来?

你用 AI 写的小工具,更常卡在缺包、版本冲突,还是换个目录就找不到文件?

如果这类小工具实测对你有用,点个赞支持一下。我会继续把值得试的东西,连同踩到的坑一起分享。

回首页,搜索你想要的文档

在首页搜索框输入关键词,快速定位资料

文库首页搜索指引 立即搜索

相关学习资料