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

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

Запись от Фаер размещена 15.01.2015 в 22:31
Показов 2090 Комментарии 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
Комментарии
 
Новые блоги и статьи
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru