Внешние модули и окружения
Как подключить пакеты pip, зачем нужен TDPyEnvManager и почему numpy лучше не подменять.
TouchDesigner несёт свой Python со своим набором пакетов (numpy, OpenCV и другие). Всё остальное подключается снаружи — и это тот самый шаг, на котором ломается большинство попыток запустить нейросеть.
Способ первый: путь к пакетам
Классический подход, работающий во всех версиях:
- Поставьте отдельный Python той же версии, что в TouchDesigner (в актуальных сборках — 3.11), или создайте виртуальное окружение.
- Установите туда пакет:
pip install --target=D:/td_packages onnxruntime-gpu
- В
Edit → Preferences → Generalвключите Add External Python to Search Path и укажите путь в Python 64-bit Module Path. Несколько путей разделяются;. - Перезапустите TouchDesigner.
Способ второй: TDPyEnvManager
Начиная с версии 2025 в палитре есть компонент TDPyEnvManager — менеджер Python-окружений прямо внутри TouchDesigner.
Что он умеет:
- создавать и подключать виртуальные окружения (venv) и окружения conda;
- работать с pip и conda из панели параметров компонента;
- автоматически добавлять окружение в пути поиска TouchDesigner;
- хранить контекст в файле рядом с проектом (
TDPyEnvManagerContext.yaml, а в свежих сборках — секция вpyproject.toml), чтобы окружение подключалось до инициализации компонентов.
Это правильный способ на 2025-й версии: окружение едет вместе с проектом, а не живёт в голове разработчика.
Thread Manager
Второй компонент из того же набора — Thread Manager. Он позволяет выполнять Python в отдельных потоках с очередью задач, не блокируя главный поток TouchDesigner.
Практический смысл: загрузка модели и инференс идут в фоне, интерфейс и картинка не замирают. Без этого любая тяжёлая библиотека роняет кадры — Как нейросеть запускается в TD.
Что нельзя подменять
Внутренние инструменты TouchDesigner полагаются на встроенные numpy и OpenCV. Подключение других версий приводит к падениям без сообщений — причём не сразу, а через час работы. Если библиотека требует другой numpy, изолируйте её в отдельном процессе.
Изоляция как стратегия
Чем тяжелее и «чужероднее» библиотека, тем разумнее не тащить её внутрь:
| Способ | Плюс | Минус |
|---|---|---|
| В том же процессе | Просто, быстро | Падение библиотеки роняет шоу |
| В потоке (Thread Manager) | Не блокирует кадр | Всё ещё один процесс |
| В Engine COMP | Изоляция от падений | Сложнее отладка |
| Отдельное приложение + Spout/NDI | Полная изоляция | Задержка, больше движущихся частей |
Для шоу почти всегда правильный ответ — два последних варианта.
Проверка
import sys
for p in sys.path: print(p)
import onnxruntime as ort
print(ort.__version__, ort.get_available_providers())
Если импорт падает — сначала проверьте версию Python, потом разрядность, потом путь. Разбор частых ошибок — Ошибки Python.