Интеграция

Бэкенд Python

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

Эта страница описывает Топаз v5.17. Прежде чем считать её актуальной, сверьте поле version в /version.json со значением 5.17.

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

Продолжите с границ интеграции, бэкенда Rust, интерпретатора и бэкендов или артефактов и развёртывания.