Появилась задачка: взять примерно сто тридцать шотов, настроить в них освещение, пофиксить проблемы при наличии, отправить на рендер. Софт — Autodesk Maya, а каждый шот представляет из себя отдельный файл с анимацией и всеми пирогами. И так двадцать пять раз, потому что двадцать пять эпизодов. Когда я брался за задачку, наивно посчитал, что можно выкатывать эпизод в месяц. Примерно те же тайминги озвучили заказчики. Жестоко ошибся: сначала стоило выяснить рабочую процедуру, благо есть у кого.Выяснив её, я пришёл в ужас. По всему выходило, что на один эпизод улетает от полутора месяцев. Поборов в себе судорожное желание найти новых заказчиков, сел думать, что можно сделать в этих обстоятельствах. Я задокументировал процесс, и расписал временные ресурсы. На множестве операций 3D-артист простаивает. Для примера, одна лишь загрузка Maya занимает минуту-две.Звучит смешно, понимаю. Смешно перестаёт быть при взгляде на эту табличку: Все шесть операций человек делает пару кликов на операцию, а потом задумчиво тупит в монитор. Очень не люблю такой формат работы, он высаживает всё внимание за пару часов. Оптимизировать пайплайн проблематично: модельки русские, анимация иранская, собирается это всё и вовсе третьей стороной, плагины под проект написаны также иранцами.Лезть во всё это великолепие руками страшно: во-первых, есть риск заблудиться навсегда, а во-вторых, убрав паузу из какого-нибудь батника можно невзначай всю телегу поломать. Зато можно имитировать оператора ПК питоном! Я собрал у коллег информацию об ошибках, возникающих в процессе работы. Убедился в том, что большая их часть — типовые, а также не помешают работе скрипта. И начал продумывать план побега, который скостит время простоя оператора. Первым делом разметил таски двумя цветами: обязательное присутствие мозга при выполнении, и необязательное. Так я вычленил операции, которые можно безболезненно перевесить на скрипт. Несколько раз пользовавшись библиотекой PyWinAuto, обратился к ней опять. Людей на рендере много и у них разные машины, потому координатный подход к автоматизации отмёлся — буду ловить кнопки по названиям. Импортнём нужные библиотеки. Первое, чего захочется — безудержного логирования! Возможно, даже со скриншотами. Но это не точно, поэтому повесим скриншот на булинь. Второе — получить список файлов с явками и паролями. Исходные файлы лежат в отдельной папке рядом со скриптом, так что всё удобно. Третье — обработать каждый файлик. Соберу конструкцию, которую дальше буду дополнять. Откроем файл в лоб через проводник. Допускаю, что есть более простые методы. Окно Майи появляется секунд через тридцать после обращения к файлу. Напишем функцию, которая проверит появление окна, и заодно даст доступ скрипту к Майе. Теперь надобно понять, что файл открылся, и с ним можно работать. Вариант повесить на таймер не годится: файлы весят по-разному, с-во берут разное время на загрузку.  PyWinAuto предлагает app.wait_cpu_usage_lower(threshold=5) — план хорош!Проверим, как выглядит кривая потребления CPU Майей: def get_app_load(app):  Майя дискретно освобождает ресурсы процессора в процессе работы, так что ждать cpu_lower смысла нет. Совместим таймер и чек нагрузки на процессор: Будем пользовать эту конструкцию для ожидания конца операций. ...предварительно обложившись инструментами. Нам понадобится: Функция, печатающая дерево элементов в выбранном диалоге: И функция, рисующая зелёный прямоугольник вокруг выбранного элемента: Диалог — dlg — это коробка с графическими элементами. А главное окно приложения — тоже диалог, потому обращаться к интересующему можно через dlg = pw.Desktop(backend="uia")["Anything"]. Независимо от способа работы с диалогом, через connect() или Desktop, понадобится определить, что этот диалог отличает от собратьев. Часто достаточно названия, отображаемого на экране.Внутри диалога лежит не просто графика, а контроллеры: кнопки, чекбоксы, тому подобное и... другие диалоги. Подключаемся к диалогу: Затем ищем и что-то делаем с необходимым элементом: Питон шибко быстрее графического интерфейса, а тем более, монструозной софтины. Так что перед совершением действия просим скрипт подождать: Eсли искомая кнопка в интерфейсе легко находится скриптом по названию — всё ок.Если находится не та — печатаем идентификаторы, находим уникальное имя кнопки  —  и всё опять ок. Дерево идентификаторов может выглядеть странно. В первую голову надо удостовериться в правильно выбранном бэкенде при подключении к приложению: Нет нужды выводить элементы всего окошка. Стоит выбрать только интересующую область. Ну а кроме того, можно настроить глубину раскопок: Этих знаний достаточно для натыка по Maya 3D, а так — возможности PyWinAuto гораздо шире. Натыкиваем операции, вставляем между ними проверку потребления ресурсов, и отпускаем скрипт в свободное плавание! При массовой обработке файлов очень, очень стоит заворачивать конструкции в Try/Except: обидно узнать, что скрипт крашнулся в два часа ночи, и всю ночь машинка стояла без дела. Проект бодро ползёт к финалу. Кроме процессов, мы оптимизировали сцены, а это тоже славно режет время на обработку. Хочу сказать спасибо разработчику PyWinAuto, потому что без него яб лёг и умер.  Люблю 3D, Python, текстà и дизайн.