01 / BEFORE THE CODE
До кода — условия запуска.
Запущенный Resolve Studio
Основной маршрут — внешний локальный Python и настольная Studio. В релизе 21.1 Blackmagic относит Python scripting к Studio; прежний опыт с Free не подтверждает текущую совместимость. Не используйте Fusion-подключение как обход ограничения редакции.
Python и библиотека одной установки
Для синтаксиса этих примеров нужен Python 3.8 или новее. Отдельно нужны совместимые 64-битные Python и native-библиотека Resolve. Номер Python, архитектуру и ограничения сверяйте с README своей установки. Наличие Python 3 само по себе не гарантирует загрузку бинарного модуля.
Локальный доступ, без сети
Для внешнего скрипта проверьте Preferences → System → General → External scripting using → Local, если этот пункт есть в вашей версии. Network не нужен для примеров на этом компьютере. Не повышайте права процесса до администратора как универсальное исправление.
Ориентируйтесь на актуальные требования Studio и документацию установленной версии, а не на старые инструкции для консоли или Free.[1][4][3]
02 / API CONTRACT
Какой объект. Какой метод. Какой результат.
scriptapp("Resolve")- Вход
- Имя приложения: строка "Resolve".
- Возвращает
- Объект Resolve; пустой результат обрабатываем как недоступность.
- Проверить
- Не вызывать последующие методы, пока объект не получен.
GetProductName()- Вход
- Без аргументов.
- Возвращает
- Название продукта.
- Проверить
- Сравнить с запущенной редакцией, не угадывать по имени файла.
GetVersionString()- Вход
- Без аргументов.
- Возвращает
- Строка версии приложения.
- Проверить
- Сохранить полную строку, включая build; не сравнивать версии лексикографически.
Контракты методов Resolve описаны Blackmagic; Python и авторские helper обозначены отдельно. Дополнительные проверки — устройство наших примеров. Непустой объект не доказывает совместимость всего API.[3]
03 / UNDERSTAND
Что именно мы подключаем
Python обращается к модулю Blackmagic, тот загружает native-компонент scripting и получает объект уже запущенного Resolve. Это локальная интеграция приложения, а не REST-запрос к сайту и не установка нейросети. MCP использует другой способ передачи команд; для первого Python-примера он не нужен.
Разделяйте три независимых вопроса: найден ли Python-файл, удалось ли загрузить его зависимости и вернуло ли приложение объект Resolve. Успех предыдущего шага не доказывает следующий. Именно поэтому пример подключения не требует ни проекта, ни таймлайна.[3]
04 / UNDERSTAND
Пути: Scripting, Modules и native-библиотека
RESOLVE_SCRIPT_API задаёт корень Developer/Scripting. Внутри него helper сам добавляет Modules/DaVinciResolveScript.py. Передавать в эту переменную уже готовую папку Modules нельзя: получится Modules/Modules. RESOLVE_SCRIPT_LIB, если задана, указывает на конкретный fusionscript.dll или fusionscript.so из той же установки.
Для обычного import DaVinciResolveScript папка Modules должна быть видна Python, например через PYTHONPATH. В нашем helper это не требуется: он загружает официальный файл по точному пути. RESOLVE_MODULES не является переменной, которую использует этот пример; прежний пользовательский alias не нужно принимать за обязательную настройку Blackmagic.
Стандартные пути ниже — ориентиры для настольной установки. Переносная установка, Linux в другом каталоге, Mac App Store, sandbox или другая архитектура требуют проверки своих файлов. Не скачивайте чужую native-библиотеку и не заменяйте установленный модуль ради совпадения с примером.[3][5]
Windows
RESOLVE_SCRIPT_API%PROGRAMDATA%\Blackmagic Design\DaVinci Resolve\Support\Developer\ScriptingRESOLVE_SCRIPT_LIBC:\Program Files\Blackmagic Design\DaVinci Resolve\fusionscript.dllPython-модуль: Modules/DaVinciResolveScript.py внутри указанной папки Scripting. Проверьте файлы своей установки.
macOS
RESOLVE_SCRIPT_API/Library/Application Support/Blackmagic Design/DaVinci Resolve/Developer/ScriptingRESOLVE_SCRIPT_LIB/Applications/DaVinci Resolve/DaVinci Resolve.app/Contents/Libraries/Fusion/fusionscript.soPython-модуль: Modules/DaVinciResolveScript.py внутри указанной папки Scripting. Проверьте файлы своей установки.
Linux
RESOLVE_SCRIPT_API/opt/resolve/Developer/ScriptingRESOLVE_SCRIPT_LIB/opt/resolve/libs/Fusion/fusionscript.soPython-модуль: Modules/DaVinciResolveScript.py внутри указанной папки Scripting. Проверьте файлы своей установки.
Это ориентиры для распространённых установок, не команда на скачивание или замену библиотек. %PROGRAMDATA% — запись переменной среды Windows; helper читает её значение и не исполняет эти строки как shell-команды.
05 / UNDERSTAND
Первый запуск без лишних действий
Скачайте оба Python-файла в одну папку. Откройте Resolve Studio; сохраните рабочие изменения. Откройте терминал в папке примера и выполните команду для своего интерпретатора. Если Python вызывается полным путём, используйте этот путь вместо python или python3 во всех последующих шагах.
Ожидается JSON с двумя непустыми полями: product и version. Значения берутся у приложения; статья не подставляет тестовую версию. Сверьте их с About DaVinci Resolve. Открывать проект ради этой проверки не нужно, поэтому ошибка project is None здесь вообще не возникает.
Не запускайте неизвестные скрипты только потому, что в них встречается официальный import. Подключение не ограничивает следующие команды режимом чтения: безопасность нашего примера определяется его содержимым, а не правами объекта Resolve.[3][4]
06 / UNDERSTAND
Почему helper не «пробует всё подряд»
При явно заданном неверном пути пример останавливается. Он не переходит незаметно к другой установке Resolve и не заменяет сбой загрузки библиотеки сообщением «модуль не найден». Исходное исключение сохранено в цепочке ошибок — оно покажет, например, проблему зависимости, архитектуры или импорта внутри модуля.
Это вспомогательный код сайта, не официальный SDK Blackmagic. Внутри loader учтено, что загружаемый wrapper может заменить свою запись в sys.modules native-модулем. Успех офлайн-теста этого механизма не подтверждает совместимость fusionscript с вашим Python.[5][6]
PYTHON / COMPLETE EXAMPLE
Прочитайте код. Затем запускайте осознанно.
Скачайте connect_resolve.py и resolve_api_connection.py либо возьмите комплект из пяти скриптов. Helper написан нами; официальный модуль DaVinciResolveScript и нативная библиотека должны браться из вашей установки Resolve.
Скачать все примеры с инструкцией (.zip) ↓"""Read application identity only. Keep resolve_api_connection.py alongside this file."""
from resolve_api_connection import connect
def inspect_application(resolve):
product = resolve.GetProductName()
version = resolve.GetVersionString()
if not product or not version:
raise RuntimeError("Application identity could not be read")
return {"product": product, "version": version}
def main():
import json
result = inspect_application(connect())
print(json.dumps(result, ensure_ascii=False, indent=2))
# No project is required. A successful read is NOT permission for later writes.
if __name__ == "__main__":
main()
Общий helper подключения — посмотреть и скачать
Этот файл находит и загружает установленный мост. При импорте Python может записывать кэш байткода, а нативный вызов — зависнуть; это не песочница и не механизм тайм-аута. Используйте доверенную локальную установку.
"""Load the installed Blackmagic module; do not install a similarly named package.
This helper uses standard desktop installation paths or RESOLVE_SCRIPT_API.
It does not enable scripting, start Resolve, open projects or retry API calls.
Validate Python/native-library compatibility against your installed README.txt.
"""
from __future__ import annotations
import importlib.util
import os
from pathlib import Path
import struct
import sys
class ResolveConnectionError(RuntimeError):
"""An explicit environment, module, or application-connection failure."""
def scripting_root() -> Path:
configured = os.environ.get("RESOLVE_SCRIPT_API")
if configured is not None:
if not configured.strip() or configured != configured.strip():
raise ResolveConnectionError("RESOLVE_SCRIPT_API is empty or has outer whitespace")
if configured.startswith(('"', "'")) or configured.endswith(('"', "'")):
raise ResolveConnectionError("Do not store literal outer quotes in RESOLVE_SCRIPT_API")
root = Path(os.path.expandvars(configured)).expanduser()
elif sys.platform == "win32":
root = Path(os.environ.get("PROGRAMDATA", r"C:\ProgramData")) / "Blackmagic Design/DaVinci Resolve/Support/Developer/Scripting"
elif sys.platform == "darwin":
root = Path("/Library/Application Support/Blackmagic Design/DaVinci Resolve/Developer/Scripting")
elif sys.platform.startswith("linux"):
root = Path("/opt/resolve/Developer/Scripting")
else:
raise ResolveConnectionError("Set RESOLVE_SCRIPT_API for this platform/installation")
if not root.is_absolute():
raise ResolveConnectionError("RESOLVE_SCRIPT_API must be an absolute Scripting directory")
return root
def module_file() -> Path:
# RESOLVE_SCRIPT_API points to Scripting, not its Modules subdirectory.
return scripting_root() / "Modules" / "DaVinciResolveScript.py"
def load_resolve_module():
if struct.calcsize("P") * 8 != 64:
raise ResolveConnectionError("Use a compatible 64-bit Python interpreter")
source = module_file()
if not source.is_file():
raise ResolveConnectionError("Official DaVinciResolveScript.py not found at: " + str(source))
configured_lib = os.environ.get("RESOLVE_SCRIPT_LIB")
if configured_lib is not None:
lib = Path(os.path.expandvars(configured_lib)).expanduser()
if not lib.is_absolute() or not lib.is_file():
raise ResolveConnectionError("RESOLVE_SCRIPT_LIB must name the installed native library file")
name = "DaVinciResolveScript"
spec = importlib.util.spec_from_file_location(name, source)
if spec is None or spec.loader is None:
raise ResolveConnectionError("Cannot create a loader for the official module")
previous = sys.modules.get(name)
module = importlib.util.module_from_spec(spec)
sys.modules[name] = module
try:
spec.loader.exec_module(module)
# Blackmagic's wrapper can replace its sys.modules entry with a native module.
loaded = sys.modules[name]
if not callable(getattr(loaded, "scriptapp", None)):
raise ResolveConnectionError("Loaded module does not expose scriptapp")
return loaded
except Exception as exc:
if previous is None:
sys.modules.pop(name, None)
else:
sys.modules[name] = previous
raise ResolveConnectionError("Official module was found, but loading it failed") from exc
def connect():
module = load_resolve_module()
try:
resolve = module.scriptapp("Resolve")
except Exception as exc:
raise ResolveConnectionError("scriptapp failed; inspect the original exception") from exc
if not resolve:
raise ResolveConnectionError("No Resolve object: check running Studio, Local access and Python environment")
return resolve
def project_manager(resolve):
manager = resolve.GetProjectManager()
if not manager:
raise ResolveConnectionError("Resolve connected, but Project Manager is unavailable")
return manager
Команды запуска
Windows / PowerShell
python .\connect_resolve.pyЗапустите из папки с обоими .py-файлами; python должен указывать на нужный интерпретатор.
macOS / Linux
python3 ./connect_resolve.pyПри нестандартной установке сначала задайте абсолютный RESOLVE_SCRIPT_API.
Что делает код
Найти файл
Helper выбирает стандартный Scripting-каталог или явно заданный RESOLVE_SCRIPT_API.
Загрузить зависимости
Официальный wrapper загружает свою native-библиотеку; ошибка сохраняет исходную причину.
Получить приложение
scriptapp вызывается один раз. При пустом результате выполнение останавливается.
Проверить чтение
Пример читает только название продукта и полную строку версии.
Helper не устанавливает Python, не включает scripting и не запускает Resolve.
Успешное чтение версии не доказывает наличие активного проекта.
Модуль Blackmagic и helper сайта — разные файлы. Скачайте оба авторских файла примера; официальный модуль берётся из установки.
DEBUG / OBSERVATION FIRST
Ошибка — отправная точка, не готовый диагноз.
Не найден DaVinciResolveScript.py
Возможная причинаНеверный корень Scripting или другая установка.
Следующая проверкаПроверьте реальный файл через Developer documentation. В RESOLVE_SCRIPT_API не дописывайте Modules.
Файл найден, но loading it failed
Возможная причинаСбой внутри wrapper/native-зависимости, а не обязательно отсутствие модуля.
Следующая проверкаПрочитайте исходное исключение. Сопоставьте Python, разрядность, архитектуру и RESOLVE_SCRIPT_LIB своей установки.
No Resolve object
Возможная причинаМодуль загрузился, но приложение не дало объект.
Следующая проверкаПроверьте запущенную Studio, Local и окружение процесса. Не подменяйте это автоматическим Fusion fallback.
Из IDE работает, из терминала — нет
Возможная причинаРазные интерпретаторы или переменные окружения.
Следующая проверкаСравните sys.executable и настройки IDE; повторите диагностику точно тем Python, который запускает рабочий скрипт.
PRACTICE / YOUR OWN EVIDENCE
Проверка «приложение — не проект»
- Запустите пример с открытым тестовым проектом и сверьте product/version в About.
- После сохранения закройте проект вручную, оставив Resolve запущенным. Повторите чтение версии.
- Сравните результаты: состояние проекта не должно быть обязательным условием проверки приложения. При отклонении остановитесь на диагностике, не добавляйте автоматическое создание проекта.
Получены реальные product/version; скрипт не вызывал создание, загрузку проекта, импорт или рендер. Реальный запуск выполните на своей установке.
Это условия вашей проверки, а не отчёт об испытании, уже выполненном на сайте.
FAQ
Вопросы, которые возникают на практике.
Нужна ли Studio?
Для описанного внешнего Python-маршрута используйте Studio. Изменения выпуска 21.1 нельзя игнорировать на основании старых руководств для Free. Эта статья не обещает обход ограничений через Console или Fusion.[1][4]
Нужно ли делать pip install DaVinciResolveScript?
В этом маршруте используется файл, поставленный с Resolve. Одноимённый пакет из стороннего реестра не становится официальным модулем автоматически. Helper не скачивает зависимости.[3]
Нужно ли включать Network?
Нет: пример запускается на той же машине. Проверьте Local в своей версии. Network расширяет поверхность доступа и не является универсальным способом починить импорт.[3]
Можно ли сразу использовать это в боевом проекте?
Пример читает только приложение, но последующий код может менять проект. Сначала проверьте свою версию и тестовый проект; успешное получение объекта не подтверждает любые будущие операции.
SOURCES / VERSION BOUNDARIES
Источники, а не подразумеваемая сертификация.
Сверка источников, офлайн-тесты Python и проверка интерфейса — разные виды подтверждения. Ни один из них не означает, что каждый пример проверен со всеми сборками Studio, ОС и версиями Python. Указанная дата — дата редакционной проверки, не сертификат живого прогона.
- Blackmagic Design — DaVinci Resolve Studio 21.1 release notes
8 сентября 2026. В объявлении выпуска Python scripting отнесён к Studio. Это источник требований редакции, а не протокол испытания наших примеров.
- Blackmagic Design — Support Center
Каталог обновлений проверен 5 октября 2026: опубликована ветка 21.1.1. Последний выпуск не равен минимальной версии каждого метода.
- Blackmagic Scripting README — snapshot 24 July 2026 (Resolve 21.0.4)
Публичная копия первичного README Blackmagic, поддерживаемая X-Raym. По ней сверены базовые сигнатуры; это не официальный хостинг и не README 21.1.1. Оригинал своей установки: Help → Documentation → Developer → Scripting → README.txt; расположение пункта зависит от версии.
- Blackmagic Design — Scripting and Automation
Официальное описание Python/Lua scripting и интеграций Studio. Нельзя переносить обещания Studio на Free без проверки конкретного выпуска.
- Python — importlib
Загрузка Python-файла по известному пути. Наш helper сохраняет исходное исключение, а не объявляет любой ImportError отсутствием модуля.
- Python — ImportError and ModuleNotFoundError
Различие ошибок поиска и загрузки зависимостей; цепочка исключений нужна для точной локальной диагностики.