为售票工具选择正确的软件包

PythonBeginner
立即练习

介绍

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,都会阻止刚才展示的有效重建。

总结

你比较了实际票价、识别直接与间接依赖,并从保存的安装方案重建获批包集合。你还在不改变原始数据和应用的情况下交付了完整价目表。软件包选择、安装成功与业务正确是分别需要判断的事项。