Ошибки Python и модулей
Импорт не работает, скрипт молчит, колбэк перестал вызываться: где смотреть и что чинить.
Python в TouchDesigner ломается предсказуемо. Первое действие всегда одно:
открыть Textport (Alt+T).
Импорт не работает
ModuleNotFoundError — самая частая ошибка. Проверяйте по порядку:
- Версия Python. Пакет должен быть собран под ту же версию, что в TouchDesigner (в актуальных сборках — 3.11). Пакет для 3.10 не подхватится.
- Разрядность — только 64 бита.
- Путь.
Edit → Preferences → General: включён лиAdd External Python to Search Pathи указан ли путь вPython 64-bit Module Path. Несколько путей разделяются;. - Перезапуск. Изменение путей требует перезапуска TouchDesigner.
- Проверка изнутри:
import sys
for p in sys.path: print(p)
Подробно — Внешние модули.
Импорт «работает», но всё падает
Признак подмены встроенных пакетов. TouchDesigner использует собственные numpy и OpenCV; параллельная версия из вашего окружения приводит к падениям без сообщений — иногда через час работы.
Решение: не подключать конфликтующие версии, а изолировать библиотеку в отдельном процессе.
Скрипт не выполняется
| Симптом | Причина |
|---|---|
| Ничего не происходит и нет ошибок | Колбэк не включён параметром узла |
| Колбэк был и перестал | Внутри было исключение — смотрите Textport |
| Скрипт работает один раз | Он и должен: это не цикл |
print ничего не печатает |
Смотрите не в тот Textport (у Engine COMP свой) |
Оборачивайте содержимое колбэков в try/except и пишите ошибку в лог:
молча переставший работать колбэк — худший вид отказа.
Типовые сообщения
AttributeError: 'NoneType' object has no attribute ... — op('имя')
вернул None: узел не найден. Проверьте путь и то, откуда он считается
(относительные пути зависят от места) — Ссылки.
Cannot modify network during cook — изменение структуры сети из
скрипта, выполняющегося внутри кука. Лечится отложенным запуском:
run("op('base1').create(nullTOP)", delayFrames=1)
Зависание интерфейса — синхронная операция в главном потоке: сетевой запрос, чтение большого файла, инференс модели. Выносите в Thread Manager или в отдельный процесс.
Отладка
debug('значение', x) # печатает с именем оператора и строкой
op('null1').errors() # ошибки конкретного узла
op('null1').warnings()
Error DAT собирает ошибки по всему проекту в таблицу — положите его в
служебную панель, и на площадке будет видно, что именно ругается —
Мониторинг.
Версия TouchDesigner, версия Python, список пакетов, версия драйвера. Через полгода при переустановке это сэкономит день.