Привет, Хабр! ? Хочу поделиться небольшим проектом, который я разработал для решения личной задачи. Возможно, кому-то он тоже пригодится.
Что это такое?
WorkStarter - это простая утилита для Windows, которая позволяет автоматически запускать программы и открывать веб-сайты при старте компьютера. Основная идея заключается в том, чтобы упростить процесс подготовки рабочего окружения после включения ПК.
Основные возможности
- ?️ Автоматический запуск программ
- ? Открытие веб-сайтов
- ⏱️ Настройка задержки для каждой задачи
- ? Графический интерфейс для управления задачами
- ? Хранение конфигурации в JSON-формате
Как это работает?
WorkStarter состоит из двух основных компонентов:
1. WorkStarter Configuration - графический интерфейс для настройки задач.
2. WorkStarterAgent - фоновый процесс, который запускается при старте системы и выполняет настроенные задачи.
Конфигурация хранится в файле config.json в пользовательской директории приложения.
Технические детали
Проект написан на Python с использованием следующих библиотек:
- PyQt6 для создания графического интерфейса
- asyncio для асинхронного выполнения задач
- appdirs для управления директориями приложения
Установка и использование
1. ⬇️ Скачайте последнюю версию WorkStarter
2. Запустите установщик и следуйте инструкциям
3. После установки запустите "WorkStarter Configuration" из меню "Пуск"
4. Добавьте нужные задачи через графический интерфейс
5. WorkStarterAgent будет автоматически запускаться при старте системы
Ограничения и планы на будущее
На данный момент утилита работает только на Windows и имеет ограниченный функционал. В будущем планируется:
- ? Добавить поддержку macOS и Linux
- ? Расширить типы поддерживаемых задач
- ? Улучшить пользовательский интерфейс
Заключение
WorkStarter - это небольшой проект, который я создал для решения собственной задачи. Буду рад, если он окажется полезным и для других пользователей. Проект открыт для предложений и улучшений.
Исходный код доступен на GitHub. Буду благодарен за обратную связь и предложения по улучшению. ?
Лучшая благодарность, которую Вы можете оказать - подписаться на мой IT канал, буду рад Вас там видеть
Комментарии (22)
sshmakov
21.10.2024 10:50C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
Управление компьютером - Планировщик заданий
Ksaverri
21.10.2024 10:50Тоже думал софтину написать на расте поначалу, но, ришел к выводу, что это тупая затея. Каждый раз, когда нужно внести изменения в запуск конкретной программы, нужно перекомпилировать. В итоге, сделал скрипт на питоне с меню, блекджеком и распутными функциями.
IvanNoskov Автор
21.10.2024 10:50Не плохо, есть репозиторий? Было бы интересно глянуть
Ksaverri
21.10.2024 10:50Не думаю, что там для Вас будет что-то интересное, так как писалось под себя. Мне к примеру не нужен автозапуск и не нужна оболочка. Со мной путешествует внешний SSD с моими проектами и программами. Ну и пара команд для личного комфорта.
import subprocess import psutil import os import pathlib print("-------------------------------------------------------------------------") print("") print("1 - Запустить все приложения") print("") print("2 - Запустить приложения, кроме торрент-клиента") print("3 - Запустить приложения, кроме приложений на диске А") print("4 - Запустить приложения, кроме приложений на диске А и торрент-клиента") print("") print("5 - Завершить все приложения") print("") print("6 - Перезагрузить Проводник") print("") print("7 - Выключить компьютер через...") print("8 - Отменить выключение компьютера") print("") print("-------------------------------------------------------------------------") print("") choice = input("Выберете пункт меню: ") print("") print("-------------------------------------------------------------------------") print("") pathToScript = os.path.dirname(__file__) localAppData = os.getenv('localappdata') apps = [\ ["ShareX.exe", "Y:\\Programs\\ShareX --- видео и снимки экрана.pyw", "1 2 3 4"], \ ["thunderbird.exe", "Y:\\Programs\\Thunderbird --- почтовый клиент.pyw", "1 2 3 4"], \ ["XYplorer.exe", "Y:\\Programs\\Apps\\XYplorer\\XYplorer.exe", "1 2 3 4"], \ ["RoyalTS.exe", "A:\\Software\\RoyalTS\\RoyalTS.exe", "1 2"], \ ["rutview.exe", "A:\\Software\\RMS\\rutview.exe", "1 2"], \ ["Telegram.exe", "Y:\\Programs\\Apps\\Telegram\\Telegram.exe", "1 2 3"], \ ["Todoist.exe", "Y:\\Programs\\Todoist (Тудуист) --- планировщик задач.pyw", "1 2 3"], \ ["qbittorrent.exe", "Y:\\Programs\\Apps\\qBittorrent\\qbittorrent.exe", "1 3"], \ ["vivaldi.exe", "c:\\Vivaldi\\Application\\vivaldi.exe", "1 2 3 4"], \ ["vivaldi.exe", f"{localAppData}\\Vivaldi\\Application\\vivaldi.exe", "1 2 3 4"], ] def runApp(x): runningApps = [] for proc in psutil.process_iter(): runningApps.append(proc.name()) for app in apps: i = 0 if not app[i] in runningApps: if app[2].find(x) >= 0 and os.path.exists(app[1]): fileExtension = pathlib.Path(app[1]).suffix if fileExtension == ".pyw" or fileExtension == ".py": subprocess.Popen(["python", app[1]], cwd=os.path.dirname(app[1])) else: subprocess.Popen(app[1], cwd=os.path.dirname(app[1])) i += 1 subprocess.run('taskkill /IM "explorer.exe" /F') subprocess.Popen('C:\\Windows\\explorer.exe') def taskKill(x): subprocess.run(f'taskkill.exe /fi "ImageName eq {x}"', check=True, shell=True) def taskKillHard(x): subprocess.run(f'taskkill.exe /F /fi "ImageName eq {x}"', check=True, shell=True) match choice: case "1": runApp("1") case "2": runApp("2") case "3": runApp("3") case "4": runApp("4") case "5": taskToKill = ["thunderbird.exe", "RoyalTS.exe", "rutview.exe", "winbox.exe", "winbox64.exe", "Telegram.exe", "Todoist.exe", "vivaldi.exe"] taskToKillHard =["qbittorrent.exe", "ShareX.exe", "whatsapp.exe", "ktalk.exe", "Pipette.exe", "steamwebhelper.exe", "steam.exe", "LagoFast.exe", "t1client-vc142e.exe", "vhui64.exe"] for task in taskToKill: taskKill(task) for task in taskToKillHard: taskKillHard(task) case "6": subprocess.run('taskkill /IM "explorer.exe" /F') subprocess.Popen('C:\\Windows\\explorer.exe') case "7": shutdownTime = int(input("Через сколько минут выключить компьютер: ")) * 60 subprocess.run('shutdown /s /t ' + str(shutdownTime), check=True, shell=True) case "8": subprocess.run('shutdown -a', check=True, shell=True) case _: print("Такого варианта не существует")
Andrey_Solomatin
21.10.2024 10:50Гляньте на модуль https://docs.python.org/3/library/cmd.html#cmd.Cmd с помощью него можно упростить работу с меню. У него есть лучшие альтернативы, но их надо устанавливать.
А еще винда поддерживает и прямые и обратные слэши. Можно использовать линуксовый стиль, чтобы не эскейпить из в строках.
'C:\\Windows\\explorer.exe'
->'C:/Windows/explorer.exe'
Sazonov
21.10.2024 10:50А ещё винду не обязательно ставить в c:/windows :)
И для работы с системными путями есть соответствующий API.
Ksaverri
21.10.2024 10:50На практике удобнее экранировать, мне по крайней мере, так как чаще всего я копирую пути. Проще дописать еще один экранирующий обратный слэш, чем стирать существующий обратный слэш и ставить слэш. На одно нажатие кнопки меньше.
Sazonov
21.10.2024 10:50В большинстве текстовых редакторов есть удобная фича - replace in selection, если уж очень хочется экономить нажатия. А в студии можно даже на 1 хоткей повесить исправление слешей в путях. Плюс такой путь с двойными обратными не получится скопировать и вставить в проводник.
И обратные слеши - это не кросс-платформенно.
Ksaverri
21.10.2024 10:50С поиском и заменой все понятно, но мне все это неудобно. Если бы мне нужно было прочесать стену текста и сделать там замену обратных слэшей, то я бы конечно так и поступил. В моем случае, проще экранировать.
Да, это не кросс-платформенно, но мне это и не требуется. У меня было много попыток использования как линуксов (самых разных), так и macos и для меня это была сущая пытка. Я с этим завязал) Линукс использую только на серверах.
russeljo
21.10.2024 10:50Мне вспомнилась тулза, которая переключает цвет панели задач в зависимости от выбранной раскладки клавиатуры, но она платная. Если бы данный функционал появился здесь или отдельным приложением - цены бы ей не было.
theGrove
Кому это интересно вообще?
yasinovskiye
Кому-то и может быть интересно, автор просто поделился своей тулзой, зачем быть таким токсичным? А вот другой вопрос зачем нужна эта тулза, если в каждой оси и так есть настройка автозапуска приложений, и в том числе запуск сайтов через URL в терминале\cmd. Стоит ли ради нечастых изменений в этих самых параметрах автозапуска разрабатывать для этого отдельный гуи ?
Sazonov
Автор поделился, ок. Но этому точно место на Хабре, а не на каком нибудь stackexchange?
Выглядит как обычная лабораторная работа 1-2 курса. Там кода на ~200 строк включая GUI. Задачи стартуются самим приложением, а не помещаются в стандартный планировщик ОС. Бизнес логика перемешана с UI. Само приложение помещается в автозапуск инсталлятором. Нет настроек для переключения между all users / current user. Думаю можно не продолжать.
IvanNoskov Автор
О, спасибо что напомнили про stackexchange. Про юзеров тоже полезно, думаю добавлю в список фич на следующие обновления
IvanNoskov Автор
Спасибо за Ваш комментарий. С данным функционалом действительно можно было бы обойтись без интерфейса и сделать все в скрипте на пару кб. Но у меня есть идеи по добавлению более комплексных и полезных задач при старте системы, вроде отправки нужных сообщений/писем, автоклики по нужным кнопкам и прочее. В таком случае хотелось бы иметь хороший ui с дополнительными настройками. (идеи могут прозвучать немного утопичными или излишними, но этот проект я делаю исходя из своих практик и опыта и хочу привнести по больше полезных фич)
Andrey_Solomatin
Есть некоторый диссонанс между качеством и полезностью инструмента и попыткой его представить как готовый продукт продать свой телеграм канал.
Я за проекты, которые позволяют получить опыт. Сам делал много бесполезной фигни.
IvanNoskov Автор
Канал я не продаю, у меня там проектики и личная жизнь, продавать там нечего. Я понимаю Вас, понимаю о чем Вы, но этот проект оказался полезным нескольким знакомым и я захотел поделиться им. Так уж я преподношу то что делаю, стараюсь рассказать по красочнее. Думаю в этом нет чего-то сугубо плохого, я ничего никому не втюхиваю и не продаю, у меня нет ни одного ресурса который я мог бы здесь монетизировать, это лишь pet проектики которые я пилю в свободное от работы время
Спасибо за Ваш комментарий
sten65
неинтересно - не читай и, тем более, не комментируй. в следующих комментариях нормально отнеслись к материалу. человек может быть первый раз что-то написал, что и другим пригодилось. поправит/подсказать - это норм, а с токсиком - на пикабу :)
UnknownCat
Мне, а есть сайт где такие разработки люди выкладывают? Я бы посмотрел, я на хабр только из-за этого захожу.
Чтобы смотреть, как люди пишут код, и объясняют свою логику того почему так.
Чтобы пополнять свои знания