Форум программистов, компьютерный форум, киберфорум
Фаер
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Python 3. Ассоциирование расширений файлов со своей программой.

Запись от Фаер размещена 15.01.2015 в 22:31
Показов 2168 Комментарии 0

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

Короче, к делу.

Допустим, данность такова:
Моё приложение представляет собой среду разработки Лунатик и позволяет редактировать .html файлы. Запустить программу и использовать её интерфейс, чтобы открыть один из таких файлов - это, конечно, вариант рабочий, но не самый изящный. Может, кто-то хочет зайти в каталог, дважды кликнуть по HTML-файлу и тем самым запустить среду, одновременно открыв в ней выбранный файл. Как это организовать!?

Предварительный въезд:
Наверняка, Вам известно, что такое реестр Windows. Это структурированная база данных, в которой уважающие себя приложения(и не только они) хранят свои данные, обычно, те, что нужно держать подальше от алчных или просто криворуких пользователей. Оказывается, в реестре также хранится информация о том, какие файлы какими программами нужно открывать. Эти данные можно настроить под себя, например, с помощью Редактора Реестра из Панели Управления. Однако Мы пишем приложение не для себя, а для тех, от кого само существование реестра следует держать в тайне. Следовательно, Нам нужно затолкать в свою программу несколько команд, которые будут незаметно производить необходимые изменения.

Практика:
Для того, чтобы изменить параметры реестра, Нам понадобится cmd. Обращаться к ней Мы будем с помощью функции call() модуля subprocess. Нужно учитывать, что команды, транслируемые в cmd, будут возвращать результаты выполнения в ту же cmd - а Нам необходимо иметь доступ к этим данным, поэтому Мы потанцуем с бубном и перенаправим stdout и stderr командной строки в текстовый файл. Для начала давайте попробуем получить список параметров из реестра, чтобы понять, нужно ли вообще что-либо изменять:

Python
1
2
3
4
import subprocess
 
with open('out.txt','w') as outfile:
    subprocess.call('reg query HKEY_CLASSES_ROOT',stdout=outfile,stderr=outfile,shell=False)
По порядку:
Команда reg query выдаёт список параметров, сохранённых под некоторым ключом. В Нашем случае, ключ(каталог, если так понятнее) называется HKEY_CLASSES_ROOT. Запустив команду, Мы направляем её поток вывода и поток ошибок в файл out.txt. Будем считать, что Наше приложение называется Proga. Проверим наличие такого каталога в реестре(может его и создавать не требуется) по списку, сохранённому в файле out.txt, и создадим запись, указывающую на главный исполняемый файл Нашей программы:

Python
1
2
3
4
5
6
7
regdata=open('out.txt').read()
 
if not 'HKEY_CLASSES_ROOT\Proga' in regdata:
    main=os.getcwd()+'\\Proga.exe'
    command=r'reg add HKEY_CLASSES_ROOT\Proga\shell\open\command /ve /f /d "\"'+main+'\\" \\"%1\\""'
    with open('out.txt','w') as outfile:
        subprocess.call(command,stdout=outfile,stderr=outfile,shell=False)
На этот раз команда у Нас посложнее. Начнём с того, что reg add - это функция создания записи в реестре. Далее Мы указываем, в каком каталоге хотим сделать запись(shell\open\command - это стандарт, форма, так что эту часть всегда пишите, не задумываясь). Если такого каталога не существует, он будет создан. Затем флагом /ve Мы создаём в новом каталоге безымянную переменную, которая в реестре будет записана под именем "(По умолчанию)". Далее идёт флаг /f. Дело в том, что, если переменная каким-то невозможным образом, всё-таки, существует, команда добавления такой же потребует от пользователя разрешения на перезапись. Чтобы этого избежать, Мы указываем флаг /f. Ну а после флага /d Мы пишем само значение свежеиспечённой переменной. Обратите внимание на тот факт, что в строке Мы использовали кучу экранирующих символов. Если не хотите залипнуть с ошибкой на несколько часов, делайте всё в точности так, как написано у меня.

После того, как выполните эту часть скрипта, откройте редактор реестра и найдите созданную запись. Выглядеть она должна точно так, как показано на скриншоте. Значок %1 - это адрес файла, на который пользователь кликнул дважды(или ПКМ), так что не вздумайте пропустить его!

Колдовство ещё не окончено. Дело в том, что сейчас Мы только зарегистрировали(если можно так сказать) приложение в системе, а вот сами ассоциации пока остались без изменений. Пишем следующую команду:

Python
1
2
with open('out.txt','w') as outfile:
    subprocess.call('reg add HKEY_CLASSES_ROOT\.html\OpenWithProgIDs /f /v Proga',stdout=outfile,stderr=outfile,shell=False)
Здесь Вам уже должно быть всё понятно. Параметры расширений записываются прямо вот в таких каталогах .html, .mp3 для музыкальных файлов или, .txt для текстовых, посреди HKEY_CLASSES_ROOT. По поводу каталога OpenWithProgIDs можете тоже не беспокоиться - он есть во всех каталогах расширений. Ну а с флагами /f и /v Мы уже знакомы. Кстати, да, в этом каталоге Мы создали переменную без значения. Она лишь указывает своим именем, из какого ключа брать адрес исполняемого файла Нашей программы.

Собственно, это всё. Теперь Вы можете смело нажать ПКМ на любом HTML-файле(или какой Вы там писали) и увидеть свою программу в списке "Открыть с помощью". Там же можно поставить галочку на "Использовать для всех файлов этого типа", чтобы решать всё двойным щелчком. Разумеется, есть вариант сделать это программно, но такая практика не соответствует правилами этикета, так что на этом Мы остановимся.

Если Вы что-то понимаете в программировании, то уже смекнули, что после нажатия "Открыть с помощью" будет запущена Ваша программа, вот только выбранный файл в ней не откроется. Вот здесь Нам и понадобится тот самый символ %1, который Мы прописали в реестре. Как Вы помните, он передавал в программу адрес выбранного файла. Узнать этот адрес уже внутри приложения можно с помощью системных аргументов:

Python
1
2
import sys
file=sys.argv[1]
Обратите внимание на тот факт, что в результате всех этих манипуляций каталог Вашей программы может с дуру измениться на тот, в котором находится запускаемый файл. Так что не забудьте записать где-нибудь адрес основного каталога программы, чтобы ничего не потерять(извлечь его, кстати говоря, можно и из сделанной ранее записи в реестре).

Так же должен обратить Ваше внимание на пару важных моментов:
Во-первых, записи в реестре, как и ассоциации по расширениям, появятся только после первого запуска Вашей программы. Исправить сие недоразумение крайне трудно, но возможно. Рекомендую порыться в dist-утилитах компилятора cx_Freeze.
Во-вторых, ассоциировать файловые расширения можно только с исполняемыми EXE-файлами(поправьте, если не так). Записывая в shell\open\command, например, адрес к Python-скрипту, Вы не сможете прописать ассоциации, и, даже если они появятся в списке "Открыть с помощью", при запуске Вы будете получать ошибку, вроде "Такой-то файл не является приложением Win32".

На этом, собственно, всё. Не забывайте ставить оценки за запись.
А ещё читайте и бахайте лайки моей новой книге.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru