Список всех установленных программ на компьютере, их директория и исполняемый файл
Я пишу код, который должен сопоставлять русское слово и названия приложений и запускать самое подходящее по названию. В принципе тут проблем нету, есть такой код для сопоставления:
from fuzzywuzzy import fuzz
from transliterate import translit
russian_word = translit(input(), 'ru', reversed=True)
data = {'name': '', 'percent': 0}
for app in installed_apps:
percentage = fuzz.ratio(app[:-4], russian_word)
if percentage > data['percent']:
data['percent'] = percentage
data['name'] = app[:-4]
print(data['name'], data['percent'])
Но вот с получением списка установленных приложений и директории исполняемого файла были проблемы. Очень долго пытался получить информацию от чата gpt, но всё мимо. Были такие варианты кода: С помощью winapps, winreg, shutil, pywin32 или просто с помощью os. Но всё что я не пробовал, всё работало неполноценно, либо список программ был не полный, либо у большинства программ не находило директорию, либо наводило вообще на все файлы (включая деинсталятор).
То-есть какая вообще идея, нужно находить исполняемый файл запуска приложения, которое было установлено с помощью любого установщика (setup с интернета, steam, epic games, microsoft store), и запускать его, зная только его примерное название. Если короче, то получить список установленных приложений и прямые пути для их запуска.
P.S Операционная система: Windows
Ответы (2 шт):
Задача не простая, но немного подумав изобрел своеобразный велосипед. Посмотрите, возможно он вас устроит))
import os
import win32com.client
def resolve_shortcut(shortcut_path):
if shortcut_path.lower().endswith((".lnk", ".url")):
shell = win32com.client.Dispatch("WScript.Shell")
shortcut = shell.CreateShortcut(shortcut_path)
target_path = os.path.abspath(shortcut.TargetPath)
_, extension = os.path.splitext(target_path)
# Исключаем unins000.exe, Uninstall.exe, setup.exe из выдачи
if extension.lower() == ".exe" and os.path.basename(target_path).lower() not in ("unins000.exe", "uninstall.exe", "setup.exe"):
return target_path
return None
def get_programs_from_start_menu():
start_menu_path = os.path.join(os.environ['ProgramData'], 'Microsoft', 'Windows', 'Start Menu', 'Programs')
programs = []
for root, dirs, files in os.walk(start_menu_path):
for file in files:
program_path = os.path.join(root, file)
programs.append(program_path)
return programs
# Пример использования
programs = get_programs_from_start_menu()
for program in programs:
exe_path = resolve_shortcut(program)
if exe_path is not None:
print(f"Ярлык: {program}, Путь к .exe: {exe_path}")
Дополнение:
import os
import win32com.client
def resolve_shortcut(shortcut_path):
if shortcut_path.lower().endswith((".lnk", ".url")):
shell = win32com.client.Dispatch("WScript.Shell")
shortcut = shell.CreateShortcut(shortcut_path)
target_path = os.path.abspath(shortcut.TargetPath)
_, extension = os.path.splitext(target_path)
# Исключаем unins000.exe и Uninstall.exe и setup.exe
if extension.lower() == ".exe" and os.path.basename(target_path).lower() not in ("unins000.exe", "uninstall.exe", "setup.exe"):
return target_path
return None
def get_shortcuts_from_path(path):
shortcuts = []
for root, dirs, files in os.walk(path):
for file in files:
shortcut_path = os.path.join(root, file)
shortcuts.append(shortcut_path)
return shortcuts
def get_programs_from_start_menu_and_desktop():
start_menu_path = os.path.join(os.environ['ProgramData'], 'Microsoft', 'Windows', 'Start Menu', 'Programs')
desktop_path = os.path.join(os.environ['USERPROFILE'], 'Desktop')
start_menu_shortcuts = get_shortcuts_from_path(start_menu_path)
desktop_shortcuts = get_shortcuts_from_path(desktop_path)
return start_menu_shortcuts + desktop_shortcuts
# Пример использования
programs = get_programs_from_start_menu_and_desktop()
for program in programs:
exe_path = resolve_shortcut(program)
if exe_path is not None:
print(f"Ярлык: {program}, Путь к .exe: {exe_path}")
Список всех установленных программ:
import subprocess
# Команда для получения списка установленных программ в Windows
command = 'wmic product get name'
result = subprocess.run(command, stdout=subprocess.PIPE, text=True, shell=True)
print(result.stdout)
В виндовс установка программ, абстрактное понятие: инсталятор лишь помещает желательно скомпилированное приложение желательно в папку programm files* (но не обязательно minecraft launcher который помещается куда-то в appdata). Так же взять "выбор пути установки" в инсталяторах, которые по факту могут быть 7zip архивами (то есть в итоге в рандомное место даже на другом диске могут скопироваться два файла типа 'my_cool_app.bat и unins111.ps1'. Следовательно 100% результата не будет. Частичный результат может быть достигнут при помощи сканирования меню пуск, рабочих столов default user & other на предмет наличия ярлыков запуска. (но это не решит проблему с minecraft) следовательно более оптимален вариант создания базы популярных приложений и их текстовой русской интерпритации (к примеру голосом запустить заставку будет прикольно C:...*.scr). Естественно это потребует полного сканирования файловой системы на предмет исполняемых файлов, поиска по базе, и добавления\изменения пути в базу. Но это не решит проблему деинсталяции\реинсталяции с новым путём. Тут возможен третий вариант (костыль): производить поиск исполняемого файла по базе, параллельно ему исспользовать "поиск винды",- пусть эта зараза отрабатывает свой хлеб.
текст слишком большой для комма, но на ответ не тянет