Как дождаться завершения рендера через DaVinci Resolve Python API
IsRenderingInProgress, цикл ожидания и финальная проверка Render Job
Показываем безопасный цикл ожидания рендера: скрипт не завершается раньше времени и после окончания читает статус Render Job.
API
Resolve Scripting API
Язык
Python
Resolve
19–20+
Требуется
Запущенный Resolve
Синтаксис
result = api_method()Параметры
- • Параметры зависят от конкретного метода Resolve Scripting API и показаны в рабочем примере.
Возвращает
Возвращаемое значение нужно проверять перед следующим шагом автоматизации.
import os
import sys
import time
from pathlib import Path
def import_resolve_module():
try:
import DaVinciResolveScript as dvr
return dvr
except ImportError:
search_paths = [
os.environ.get("RESOLVE_SCRIPT_API", ""),
os.environ.get("RESOLVE_MODULES", ""),
r"C:\ProgramData\Blackmagic Design\DaVinci Resolve\Support\Developer\Scripting\Modules",
"/opt/resolve/Developer/Scripting/Modules",
"/opt/BlackmagicDesign/DaVinciResolve/Developer/Scripting/Modules",
"/Library/Application Support/Blackmagic Design/DaVinci Resolve/Developer/Scripting/Modules",
str(Path.home() / "Library/Application Support/Blackmagic Design/DaVinci Resolve/Developer/Scripting/Modules"),
]
for path in search_paths:
if path and os.path.isdir(path) and path not in sys.path:
sys.path.append(path)
import DaVinciResolveScript as dvr
return dvr
def safe_call(obj, name, *args, **kwargs):
try:
fn = getattr(obj, name, None)
if callable(fn):
return fn(*args, **kwargs)
except Exception:
return None
return None
def get_project_and_timeline():
dvr = import_resolve_module()
resolve = dvr.scriptapp("Resolve")
if not resolve:
raise RuntimeError("DaVinci Resolve API недоступен")
project_manager = safe_call(resolve, "GetProjectManager")
project = safe_call(project_manager, "GetCurrentProject") if project_manager else None
if not project:
raise RuntimeError("Нет открытого проекта DaVinci Resolve")
timeline = safe_call(project, "GetCurrentTimeline")
if not timeline:
raise RuntimeError("Нет активного Timeline")
return resolve, project, timeline
def wait_render_complete(project, job_id, poll_seconds=1.0):
while safe_call(project, "IsRenderingInProgress"):
status = safe_call(project, "GetRenderJobStatus", job_id) or {}
progress = ""
if isinstance(status, dict):
progress = status.get("CompletionPercentage", status.get("Completion", ""))
print("Rendering...", progress)
time.sleep(poll_seconds)
return safe_call(project, "GetRenderJobStatus", job_id) or {}
resolve, project, timeline = get_project_and_timeline()
job_id = safe_call(project, "AddRenderJob")
if not job_id:
raise RuntimeError("Render Job не создан")
if not safe_call(project, "StartRendering", [job_id]):
if not safe_call(project, "StartRendering", job_id):
raise RuntimeError("StartRendering не запустил render job")
final_status = wait_render_complete(project, job_id)
print("Final status:", final_status)
Документация
Что делает пример
Функция wait_render_complete проверяет IsRenderingInProgress и спит между проверками. Это простой и надежный способ дождаться завершения рендера без постоянной нагрузки на Resolve.
Почему нужен poll interval
Проверять статус слишком часто бессмысленно. Интервал в одну секунду достаточно отзывчивый для логов и при этом не создает лишних вызовов API.
Что делать после ожидания
После выхода из цикла нужно прочитать финальный статус и проверить наличие файла в TargetDir. Сам факт окончания рендера еще не гарантирует, что файл создан успешно.
Разбор примера
Подключение к Resolve
Пример начинает работу с подключения к запущенному DaVinci Resolve через официальный Python-модуль.
Проверка проекта
Перед вызовами Media Pool, Timeline или Render Queue код проверяет наличие открытого проекта.
Вызов метода API
Основной блок выполняет задачу статьи: как дождаться завершения рендера через davinci resolve python api.
Проверка результата
После вызова API результат проверяется, чтобы скрипт не продолжал работу с пустым объектом или не созданной задачей.
Особенности Resolve API
- Не используйте бесконечный tight loop без sleep.
- Если рендер не стартовал, IsRenderingInProgress() сразу вернет False.
- Для интерфейса можно отправлять progress в UI вместо print.
- При пакетных рендерах контролируйте каждый job id отдельно.
Частые ошибки
Resolve API недоступен
Причина: Приложение не запущено или Python не видит DaVinciResolveScript.
Решение: Запустите Resolve и проверьте путь к Developer/Scripting/Modules.
Метод вернул None или False
Причина: В Resolve нет нужного проекта, Timeline, клипов, preset или доступа к папке.
Решение: Проверьте входные данные и добавьте явную проверку результата после каждого важного вызова API.
Скрипт работает только на одной машине
Причина: Пути к файлам или папкам Resolve зашиты под конкретную систему.
Решение: Вынесите пути в переменные и добавьте стандартные пути Windows, Linux и macOS.
Следующий шаг
Следующий шаг зависит от задачи: импорт медиа, создание Timeline или запуск рендера.
Связанные статьи API
Render
Как получить статус Render Job через DaVinci Resolve Python API
Разбираем рабочий способ прочитать статус задания рендера по job id и корректно обработать результат Complete, Failed или пустой статус.
Render
Полный пайплайн рендера DaVinci Resolve через Python API
Финальный пример объединяет стандартные вызовы Resolve API в один рабочий сценарий: подготовить рендер, создать job, запустить его, дождаться завершения и вернуть путь к файлу.
Render
Как запустить один Render Job через DaVinci Resolve Python API
Рабочий пример показывает, как запускать только свежий Render Job и не трогать старые задания, которые могли остаться в Render Queue.

