2025, Nov 19 06:02
Как открыть локальный путь из уведомления macOS в Python (pync)
Разбираем, почему в pync параметр open не открывает локальный путь в уведомлениях macOS, и даем решение: использовать execute с командой open и terminal-notifier.
Сделать уведомления macOS интерактивными из Python довольно просто — пока не возникает необходимость открыть локальный путь прямо из уведомления. На macOS часто используют pync как тонкую обёртку над terminal-notifier, и именно здесь всплывает тонкость: параметр open, который, казалось бы, должен открывать файл или каталог, не срабатывает при передаче локального пути, даже если остальной код отрабатывает без проблем.
Краткий пример проблемы
В следующем примере отправляется уведомление, которое по клику должно открыть подпапку на рабочем столе. Второе уведомление с URL работает нормально, что поначалу лишь усиливает недоумение.
import os
import platform
user_desktop = os.path.join(os.path.expanduser("~"), "Desktop")
path_to_view = os.path.join(user_desktop, "my Schedules")
if platform.system() == "Darwin": # macOS
from pync import Notifier
print("dispatching notification")
Notifier.notify(
"Your files are ready. Click to view.",
title="my Schedule Generator",
sound=True, # Необязательный звук
open=path_to_view # Ожидается, что сделает уведомление кликабельным
)
print("attempted to open path")
Notifier.notify("website link", open="http://github.com/", title="titling")
Сообщения print выводятся, и уведомление с URL открывается как ожидается. А вот кликабельное уведомление с локальным путём так и не появляется.
Что на самом деле происходит
Дело в самом pync. Согласно документации pync на PyPI, примеры с параметром open выглядят корректно, но на практике не работают. pync не обновлялся с 2018 года, что, вероятно, указывает на несовместимость с актуальными версиями macOS. Отсюда и поведение: URL открывается, а локальный путь, переданный через open, тихо игнорируется.
Есть ещё одно условие, которое стоит проверить: pync зависит от утилиты terminal-notifier. Без неё уведомления не будут работать как задумано. Проект — terminal-notifier, доступен по адресу https://github.com/julienXX/terminal-notifier.
Рабочий подход
Чтобы по клику открывался нужный объект, замените параметр open на execute. Это позволяет terminal-notifier выполнить команду по клику. Стандартной команды macOS open достаточно, чтобы запустить нужный файл или путь.
from pync import Notifier
# файл, который нужно открыть
TARGET_ITEM = __file__
Notifier.notify("Check this out", execute=f'open "{TARGET_ITEM}"')
Такой приём обходит неработающий параметр open и передаёт действие системной команде open через execute.
Применение к исходному сценарию
Если цель — сделать путь на рабочем столе кликабельным, оставьте логику формирования пути и подставьте execute, чтобы вызвать open с тем же значением. Остальной скрипт можно не менять, включая уведомление с URL — оно и так работает правильно.
import os
import platform
home_desk = os.path.join(os.path.expanduser("~"), "Desktop")
click_target = os.path.join(home_desk, "my Schedules")
if platform.system() == "Darwin": # macOS
from pync import Notifier
print("dispatching notification")
Notifier.notify(
"Your files are ready. Click to view.",
title="my Schedule Generator",
sound=True,
execute=f'open "{click_target}"'
)
print("attempted to open path")
Notifier.notify("website link", open="http://github.com/", title="titling")
Почему это важно
Действия по клику в уведомлениях — часть многих сценариев продуктивности и автоматизации. Опора на аргумент, который формально задокументирован, но не работает на современных системах, приводит к хрупкому UX и лишней отладке. Знание, что open в pync ненадёжен, а execute — безопасный путь, помогает стабильно открывать то, что ожидает пользователь.
Выводы
Если уведомление pync ничего не делает, хотя должно открывать локальный путь, дело не в ветке if или сборке пути. Проблема — в самом параметре open. Используйте execute с системной командой macOS open, чтобы добиться того же результата. Убедитесь, что установлен terminal-notifier, оставьте уведомления с URL без изменений — и кликабельные уведомления будут работать предсказуемо.