Мои Python-скрипты на каждый день

В начале поста остановлюсь на использовании пакетного менеджера uv для удобного выполнения Python-скриптов, а дальше пройдусь по конкретным примерам из своей коллекции.

Как uv всё изменил

В прошлом году пакетный менеджер uv стал поддерживать PEP 723 – Inline script metadata. Это даёт возможность указать зависимости, требуемые для работы скрипта, в комментарии в начале непосредственно файла с кодом. То есть, всё необходимое для запуска хранится в одном файле, и не требуется создание дополнительных вроде requirements.txt или pyproject.toml. Также нет необходимости вручную создавать виртуальное окружение с установкой зависимостей перед запуском скрипта.

Выглядит это следующим образом:

#!/usr/bin/env -S uv run --quiet --script
# /// script
# dependencies = [
#   "requests",
# ]
# ///
import requests

response = requests.get(
    "https://raw.githubusercontent.com/hazadus/readwise-links/refs/heads/main/links/tags/uv.md"
)
print(response.text)

При выполнении такого скрипта, uv автоматически скачает необходимые зависимости (в приведенном примере – библиотеку requests) при первом запуске, и закэширует их. Последующие запуски будут происходить быстрее.

Все описанные ниже скрипты построены на этом принципе.

Устанавливается uv легко:

# Для macOS and Linux:
curl -LsSf https://astral.sh/uv/install.sh | sh

Остальные подробности тут: https://github.com/astral-sh/uv.

Делаем скрипты запускаемым отовсюду

Чтобы ваши скрипты были доступны отовсюду в системе, нужно выполнить два шага:

  1. Сделать каждый скрипт исполняемым командой вида chmod +x myscript.py
  2. Добавить директорию со скриптами в переменную окружения PATH в файле настроек вашего shell. Например, у меня в конце ~/.bashrc есть такие строчки:
    # Мои утилиты и скрипты
    export PATH="/Users/hazadus/Projects/my-scripts/scripts:$PATH"
    

    После изменения ~/.bashrc перезапустите shell или выполните source ~/.bashrc, чтобы изменения применились.

Чтобы убедиться, что всё настроено верно, вызовите свой скрипт будучи в любой директории системы командой вида myscript.py, или проверьте корректность настройки PATH командой which myscript.py.

Система

theme.py

Код на Github

Переключает системную тему в темный или светлый режим. Скрипт является обёрткой для удобных вызовов AppleScript, которые и выполняют основную задачу. Пользуюсь пару раз в день.

Примеры использования:

# Переключиться на тёмный режим
theme.py dark
# Переключиться на светлый режим
theme.py light

Подробнее про AppleScript:

Буфер обмена

clipmon.py

Код на Github

Существует множество утилит, которые сохраняют историю информации в буфере обмена операционной системы для повторного использования. Я постоянно пользуюсь для этого Maccy и Raycast, и они классные. Но объединяет их одно: количество записей в истории ограничено. Поэтому я решил создать свою утилиту, ведущую бесконечный "архив" информации в буфере обмена.

Скрипт работает в фоне, мониторит изменения в буфере обмена MacOS через библиотеку pyobjc и сохраняет все новые данные в файлах в моей домашней директории. Пользуюсь им постоянно.

При необходимости, можно найти нужное за доли секунды при помощи ripgrep:

rg python ~/clipmon

# Пример вывода:
/Users/hazadus/clipmon/text/clip_2025-10-21_09-54-18.txt
33:        ```python

/Users/hazadus/clipmon/text/clip_2025-10-31_00-07-25.txt
4:  -- Автоматический выбор на основе .python-version или pyproject.toml

Дополнительно:

  • PyObjC – работа с Objective-C фреймворками MacOS из Python.

Мультимедиа

getsong.py

Код на Github

Один из моих любимых и самых ценных скриптов. Пользуюсь почти каждый день.

Мне часто кидают ссылки на миксы или лайвы на YouTube или SoundCloud, но слушать их оттуда мне некомфортно. При помощи скрипта, я скачиваю музыку по ссылке, сохраняю в удобной мне директории, конвертирую в MP3 и – при желании – сразу открываю их в системной программе "Музыка". Тут даже есть прекрасный бонус: при открытии файла, "Музыка" сразу начинает его воспроизводить и закачивает в своё "яблочное" облако. При желании я могу продолжить прослушивание файла с айфона или айпада, что суперудобно.

Использую так:

getsong.py "$(pbpaste)" --mp3 --open

Эта команда скачивает файл по ссылке из буфера обмена, конвертирует в MP3 и сразу открывает в "Музыке".

Изображения

auto_crop.py

Код на Github

Пример скрипта, созданного для решения частной, но очень нудной для меня задачи.

Однажды мне надо было удалить лишнее пустое пространство вокруг изображения в файлах с иконками. Причём так, чтобы иконка была правильно отцентрирована даже в том случае, если она не квадратных пропорций. Подозреваю, что знатоки графических редакторов сделают это практически мгновенно. Но я, к сожалению, совсем не дружу с графическими редакторами! Таким образом и появился этот скрипт. Поставленные задачи он выполнил, и пока больше не требовался.

Социальные сети

toot.py

Код на Github

Позволяет отправлять посты от своего имени в сеть Mastodon. Отдельно этот скрипт не использую, но он лёг в основу аналогичного функционала в моём проекте readwise-links.

masto_feed.py

Код на Github

Читает мою ленту Mastodon за указанную дату и выводит её в формате Markdown. Каждый день автоматически запускается и генерирует файл за предыдущие сутки в репо mastodon-reader.

Кстати, это пример ещё одной плодотворной темы – использование скриптов для автоматизаций, запускаемых на GitHub по расписанию. Надеюсь в будущем рассказать о ней в отдельном посте.

bsky_feed.py

Код на Github

По сути, аналогичен предыдущему скрипту, только читает мою ленту Bluesky за указанную дату и выводит её в формате Markdown. Каждый день автоматически запускается и генерирует файл за предыдущие сутки в репо bluesky-reader.

Разное

toggltrack.py

Код на Github

Получает из Toggl Track и выводит обобщенную информацию о времени, затраченном на проекты и задачи в них, за указанный период времени. Использую регулярно для анализа.

Заключение

Мне бы хотелось, чтобы этот пост вдохновил читателей на разработку персональных решений для автоматизации своих личных задач. В репозитории вы найдёте ещё больше разных скриптов, а здесь я рассказал про самые полезные для меня и часто используемые.

Если у вас уже есть своя подборка скриптов для выполнения рутинных дел, или вы нашли что-то полезное для себя в этом посте – обязательно поделитесь!

Ссылки

Отправить сообщение

С помощью формы ниже, вы можете связаться с автором сайта. Пожалуйста, укажите ваш ник в Телеграме или e-mail, чтобы я смог вам ответить!