Zen of Python
18.9K subscribers
1.39K photos
202 videos
38 files
3.56K links
Полный Дзен Пайтона в одном канале

Разместить рекламу: @tproger_sales_bot

Правила общения: https://tprg.ru/rules

Другие каналы: @tproger_channels

Сайт: https://tprg.ru/site

Регистрация в перечне РКН: https://tprg.ru/xZOL
Download Telegram
ffmpeg вернул нулевой код возврата, а видео на выходе оказалось битым

Внешние утилиты из Python проверяют обычно одинаково: subprocess.run(..., check=True), и раз исключения нет, значит всё получилось. С ffmpeg этого мало: он спокойно отрабатывает с нулевым кодом и отдаёт файл, собранный не из тех фрагментов, которые вы просили, а заметить это можно, только досмотрев результат до конца.

В ReelCraft, CLI на Python для сборки ролика из папки с фото и видео, такое случилось трижды: Gemini 3.7 Flash разбирает ассеты и предлагает список нарезки, ffmpeg режет по нему, оба этапа отчитываются об успехе. Что именно разъехалось в склейке и субтитрах, разбирает дев-лог автора.

Приём оттуда полезен и без видео: между выводом модели и вызовом ffmpeg лежит edl.yaml, который человек читает и подтверждает руками. И проверять после subprocess стоит артефакт, тем же ffprobe, а не код возврата.

#python
deepcopy копирует всё, до чего дотянется, включая то, что вы копировать не собирались

Знакомая поломка: конфиг сложили в словарь, сделали copy.copy, поправили вложенный список в клоне и увидели правку в оригинале. Новый контейнер получает те же ссылки на вложенные объекты.

copy.deepcopy идёт по графу рекурсивно и ведёт словарь memo: каждый скопированный объект запоминается по id. Циклическая ссылка поэтому не уводит копирование в бесконечность, а два поля, смотревшие на один список, в копии тоже смотрят на один. Плата — обход всего графа: объект, который держит открытый сокет или пул соединений, deepcopy либо уронит, либо утащит за собой пол-приложения.

Поведение настраивается методами __copy__ и __deepcopy__: класс сам решает, что воспроизвести заново, а что отдать по ссылке.

Разбор поверхностной и глубокой копии — в статье на dev.to.

#python
1