Интеграция

Бэкенд Python

Соберите проверенный пакет Топаза в управляемый продукт Python и запустите его без дерева исходного кода Топаза.

Выбирайте путь 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:

TOPAZ
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:

TOPAZ
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)
}

Проверьте исходный код Топаза

Проверьте пакет, выполните выбранный тест и зафиксируйте эталонный вывод:

BASH
topaz check --root . --locked
topaz test tests/plan.tpz --root . --locked
topaz run --root . --locked

Тест сообщает tests/plan.tpz: test-ok, а запуск выводит:

Вывод
tasks=2, remaining=25 minutes

emit для изучения, build для поставки

Используйте emit, только если нужно изучить или интегрировать созданный исходный код Python:

BASH
topaz emit --target python --root . --locked --out-dir ../dist/python-source

Полный управляемый продукт Python создаётся командой build:

BASH
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.py

topaz-artifact.json записывает цель python, требование Python 3.11 или новее, команду запуска, размер и SHA-256 каждого управляемого файла. Топаз записывает манифест последним и отклоняет изменённый файл, небезопасную коллизию или другую цель в том же каталоге. Поставляйте всё дерево: program.py и topaz_py_rt.py должны оставаться вместе, а уведомления, лицензия и манифест входят в управляемый продукт.

Запустите без доступного исходного кода Топаза

Каталог dist находится вне пакета, поэтому переместите исходный пакет и запустите только продукт:

BASH
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, интерпретатора и бэкендов или артефактов и развёртывания.