Интеграция

Бэкенд 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 УчебнаяЗадача {
    название: string,
    минуты: int,
    выполнена: bool = false,
}

function разобратьМинуты(текст: string) -> Result<int, string> {
    match toInt(текст) {
        case Some(значение) if значение > 0 => Ok(значение)
        case _ => Err("minutes must be a positive integer")
    }
}

export function создатьЗадачу(
    название: string,
    текстМинут: string,
    выполнена: bool = false,
) -> Result<УчебнаяЗадача, string> {
    let минуты = разобратьМинуты(текстМинут)?
    Ok(УчебнаяЗадача { название: название, минуты: минуты, выполнена: выполнена })
}

export function подвестиИтог(задачи: Array<УчебнаяЗадача>) -> string {
    let mut осталось = 0
    for задача in задачи {
        if !задача.выполнена {
            осталось = осталось + задача.минуты
        }
    }
    "tasks={задачи.length}, remaining={осталось} minutes"
}

Точка входа пакета src/main.tpz:

TOPAZ
import src.plan { УчебнаяЗадача, создатьЗадачу, подвестиИтог }

export function main(аргументы: Array<string>, ввод: string) -> Result<int, string> {
    let задачи: Array<УчебнаяЗадача> = [
        создатьЗадачу("Run first program", "10", true)?,
        создатьЗадачу("Build application", "25", false)?,
    ]
    print(подвестиИтог(задачи))
    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.

Ограниченный профиль приложения Lispex не является возможностью созданного Python. Пакет, достигающий этой возможности, отклоняется до записи артефакта Python. Выберите интерпретатор или допущенную нативную цель в руководстве по ограниченному приложению. Продолжите с границ интеграции, бэкенда Rust, интерпретатора и бэкендов или артефактов и развёртывания.