介绍
BenchTicket 将活动订单转换为可供售票窗口使用的价目表。当前安装会搜索两个软件包来源;虽然安装成功,同名替代包却改变了票价。
你将比较正常业务输出、识别已安装依赖,并保存能够重建获批工具的安装方案。所有软件包名称与来源均为合成内容,限定在本实验内。你需要基本终端与文本文件操作能力,无需编写 Python 程序。
阅读售票台的正常样例
本步骤先理解价目表,再修改依赖。从 Terminal 开始。cd 切换目录;绝对路径可在任意当前位置使用:
cd /home/labex/project/ticket-build
orders.csv 是一个小型逗号分隔表,每个订单包含 ID、成人与儿童数量、会员值。cat 打印文件:
cat orders.csv
成人票 1200 分,儿童票 600 分。至少两位成人和两位儿童的订单减 400 分;会员再减 200 分,最低为零。一分是货币单位的百分之一。
预置的 demo 运行独立的获批示例安装,不会完成你的项目环境:
/opt/labex-lookalike/demo
T101 应为 3200,32.00,T103 为 1600,16.00,T104 仍为零。这些关系比软件包版本标签更重要。保留原始订单与应用。
观察安装成功但票价错误的情况
本步骤区分安装成功与业务正确。留在 Terminal 的 ticket-build 目录。
虚拟环境保存项目专用 Python 包。python3 是解释器,-m 运行模块。venv 模块创建环境;--without-pip 不再复制一份 pip,因为预置 pip 可用 --python 管理另一环境:
python3 -m venv --without-pip .venv
阅读预置安装方案:
cat install.sh
bash 运行此脚本。"$1" 是第一个参数,即环境路径;引号让路径保持为整体。set -e 在安装失败时停止脚本。--isolated 忽略用户 pip 设置与环境变量;--no-cache-dir 避免下载缓存。--index-url 与 --extra-index-url 指定两个包索引,-r 读取依赖要求。
bash install.sh .venv
现在用该环境的解释器运行原始调用程序:
.venv/bin/python quote.py orders.csv
T101 错误地变为 3600,36.00,T103 为 1800,18.00。受控替代包只改变计算行为,不窃取数据。安装成功退出并不能证明票价正确。
确认解析器选中了什么
本步骤将错误行为关联到实际安装的包。包索引列出可用的发行包;wheel 是可安装的 Python 包归档。
python3 -m pip 以模块方式运行 pip。其 show 命令读取 --python 所选环境的已安装元数据:
python3 -m pip --isolated --python .venv show benchticket-prices benchticket-labels
预期 prices 为 9.0.0,它依赖 benchticket-labels;labels 为 1.0.0。Labels 是间接依赖:安装 prices 时,pip 也安装了它。发行包名的连字符对应这些导入名中的下划线。
阅读独立提供的批准目录:
cat /opt/labex-lookalike/approval/packages.tsv
获批版本是 prices 1.4.0 和 labels 1.0.0。下一实验会使用 SHA-256 列。
Pip 搜索两个配置的索引;--extra-index-url 并非低优先级备用源。此处匹配的较高版本胜出。本地 public 路径是合成的第二来源,并非真实 PyPI。接下来将安装方案限制到经过审查的软件包集合。
保存并应用获批安装方案
本步骤保存获批版本并使用获批索引。== 表示精确版本要求。
下面的 here-document 写入整个文件。> 替换指定文件;<<'EOF' 按原样读取后续各行,直到仅包含 EOF 的一行。仅对两个允许编辑的安装方案文件使用它:
cat > requirements.txt <<'EOF'
benchticket-prices==1.4.0
benchticket-labels==1.0.0
EOF
替换安装方案,保留环境参数与失败停止行为。获批索引包含两个所需包:
cat > install.sh <<'EOF'
#!/bin/bash
set -e
python3 -m pip --isolated --python "$1" install --no-cache-dir --index-url http://127.0.0.1:8123/approved/simple -r requirements.txt
EOF
bash install.sh .venv
Pip 将 prices 9.0.0 替换为 1.4.0。再次读取已安装版本:
python3 -m pip --isolated --python .venv show benchticket-prices benchticket-labels
两者应与目录一致。如果路径输错,用 cd /home/labex/project/ticket-build 返回,以 cat 检查两个文件,再重复安装,无需重置 VM。
交付每个订单的正确价格
本步骤生成真正的售票窗口价目表。预置调用程序读取所提供 CSV、调用已安装包的函数,并格式化每个金额。--output 选项保存结果:
.venv/bin/python quote.py orders.csv --output handover.csv
cat handover.csv
T101 至 T105 的总额必须依次为 3200、1200、1600、0 和 4200 分。ID、数量和会员值必须对应正确订单。
diff -u 比较两个文本文件并显示变化行。与独立提供的示例比较:
diff -u /opt/labex-lookalike/approval/reference.csv handover.csv
没有输出表示文件一致。$? 保存紧接着的上一命令退出状态;在其他命令改变它之前读取:
echo $?
预期为 0。差异返回 1;这不同于文件缺失或 Python 导入错误。修复安装方案并重新安装,再运行调用程序。不要修改订单或手工输入价目表。
不借用首个环境重新构建
本步骤确认保存的安装方案能独立于当前安装工作。第二个虚拟环境初始不包含售票包:
python3 -m venv --without-pip .rebuild
向同一安装方案传入不同目标:
bash install.sh .rebuild
.rebuild/bin/python quote.py orders.csv
预期仍是五个正确订单。原 .venv、已保存的 handover.csv、订单与调用程序仍保留。
结果证明安装方案适用于所提供的获批来源。精确版本本身不能确定精确字节:另一来源可以在相同名称和版本下提供不同 wheel。下一独立实验用哈希建立这条边界。
本实验使用合成、受控的软件包服务器,并非生产私有索引。关闭所有来源或复制已知 CSV,都会阻止刚才展示的有效重建。
总结
你比较了实际票价、识别直接与间接依赖,并从保存的安装方案重建获批包集合。你还在不改变原始数据和应用的情况下交付了完整价目表。软件包选择、安装成功与业务正确是分别需要判断的事项。



