Введение
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 привела и к её установке. Дефисы в этих именах дистрибутивов соответствуют подчёркиваниям в именах импорта.
Прочитайте независимо предоставленный каталог одобрения:
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 помешает только что показанной полезной пересборке.
Резюме
Вы сравнили реальные цены, определили прямые и косвенные зависимости и восстановили одобренный набор по сохранённому рецепту. Также вы передали полный прайс-лист без изменения исходных данных и приложения. Выбор пакетов и успешная установка — отдельные вопросы от правильности бизнес-результата.



