Выбирайте путь Python, если в целевой среде есть Python 3.11 или новее и полезно получить читаемый созданный продукт. Python остаётся целью сборки, а его конструкции не становятся синтаксисом Топаза.
Предварительные требования
- Завершите пакет
study-planиз раздела Первое приложение. - Храните вместе
topaz.toml,topaz.lock,src/plan.tpz,src/main.tpzи выбранный тест. - Установите в целевой среде Python 3.11 или новее.
- Выполняйте следующие команды из каталога
study-plan.
Во время исполнения продукту не нужны компилятор Топаза или файлы .tpz.
Однако он включает созданный исходный код Python и вспомогательный модуль,
поэтому не является платформенным исполняемым файлом.
Общий проверяемый пакет
На странице Rust используются те же два модуля Топаза. Сначала
src/plan.tpz:
export record StudyTask {
title: string,
minutes: int,
done: bool = false,
}
function parseMinutes(text: string) -> Result<int, string> {
match toInt(text) {
case Some(value) if value > 0 => Ok(value)
case _ => Err("minutes must be a positive integer")
}
}
export function makeTask(
title: string,
minuteText: string,
done: bool = false,
) -> Result<StudyTask, string> {
let minutes = parseMinutes(minuteText)?
Ok(StudyTask { title: title, minutes: minutes, done: done })
}
export function summarize(tasks: Array<StudyTask>) -> string {
let mut remaining = 0
for task in tasks {
if !task.done {
remaining = remaining + task.minutes
}
}
"tasks={tasks.length}, remaining={remaining} minutes"
}Точка входа пакета src/main.tpz:
import src.plan { StudyTask, makeTask, summarize }
export function main(args: Array<string>, stdin: string) -> Result<int, string> {
let tasks: Array<StudyTask> = [
makeTask("Run first program", "10", true)?,
makeTask("Build application", "25", false)?,
]
print(summarize(tasks))
Ok(0)
}Проверьте исходный код Топаза
Проверьте пакет, выполните выбранный тест и зафиксируйте эталонный вывод:
topaz check --root . --locked
topaz test tests/plan.tpz --root . --locked
topaz run --root . --locked
Тест сообщает tests/plan.tpz: test-ok, а запуск выводит:
tasks=2, remaining=25 minutesemit для изучения, build для поставки
Используйте emit, только если нужно изучить или интегрировать созданный
исходный код Python:
topaz emit --target python --root . --locked --out-dir ../dist/python-source
Полный управляемый продукт Python создаётся командой build:
topaz build --target python --root . --locked --out-dir ../dist/python
После сборки запускайте program.py явно. Сборка Python отклоняет --run и
--release: это не параметры продукта Python. Параметр Rust --backend при
сборке Python также недопустим.
Проверьте управляемый продукт
Продукт содержит:
dist/python/
├── GENERATED-OUTPUT-NOTICE.txt
├── LICENSE
├── NOTICE
├── program.py
├── topaz-artifact.json
└── topaz_py_rt.pytopaz-artifact.json записывает цель python, требование Python 3.11 или
новее, команду запуска, размер и SHA-256 каждого управляемого файла. Топаз
записывает манифест последним и отклоняет изменённый файл, небезопасную
коллизию или другую цель в том же каталоге. Поставляйте всё дерево:
program.py и topaz_py_rt.py должны оставаться вместе, а уведомления,
лицензия и манифест входят в управляемый продукт.
Запустите без доступного исходного кода Топаза
Каталог dist находится вне пакета, поэтому переместите исходный пакет и
запустите только продукт:
cd ..
mv study-plan source-unavailable
python3 dist/python/program.py
В Windows используйте Rename-Item study-plan source-unavailable, затем
запустите python dist\python\program.py. Продукт завершается с кодом 0 и
печатает тот же результат.
Восстановление с учётом цели
Генератор Python сообщает о неподдерживаемых операциях стандартной библиотеки с
указанием места в исходном коде до записи артефакта. На этой цели недоступны
Codec.deflateFixedCompress, Codec.zlibFixedCompress и
Codec.reedSolomon255223Protect. Оставьте такую операцию на поддерживаемой
цели или выберите другую реализацию, затем повторите сборку.
Если program.py не может импортировать topaz_py_rt.py, восстановите всё
управляемое дерево, а не копируйте один созданный файл. Если версия Python
слишком стара, установите в целевой среде Python 3.11 или новее.
Точная граница
Созданный Python — заменяемый артефакт поставки, а не стабильный API для
ручного расширения и не платформенный исполняемый файл. Успешный запуск
подтверждает вывод и код завершения этой программы в выбранной среде Python.
Он не открывает произвольные библиотеки, исключения, декораторы или API
пакетов Python для файлов .tpz.
Продолжите с границ интеграции, бэкенда Rust, интерпретатора и бэкендов или артефактов и развёртывания.