Я написал ниже, в котором используется winapps
, как было предложено в моем предыдущем ответе. Эта реализация имеет множество ограничений, например, она работает только для программ, установленных для всех пользователей. Однако вы можете изменить этот код, чтобы использовать другой способ получения места установки и использовать getPossibleExePaths
для получения исполняемых файлов. Этот ответ дает несколько альтернативных способов, которые могут быть лучше, чем winapps
.
import os
import winapps
import subprocess
def getPossibleExePaths(appPath):
if not appPath:
raise Exception("App Path cannot be None")
pattern = appPath + ":*exe"
try:
returned = subprocess.check_output(['where', pattern]).decode('utf-8')
listOfPaths = filter(None, returned.split(os.linesep))
return [i.strip() for i in list(listOfPaths)]
except subprocess.CalledProcessError as e:
raise Exception(f"Error getting path for '{appPath}'")
def getAppPath(appName):
for app in winapps.search_installed(appName):
installPath = str(app.install_location)
if installPath and installPath != "None":
return installPath
return None
if __name__ == '__main__':
print(getPossibleExePaths(getAppPath('Chrome')))
В этом коде используется команда Windows where
, поэтому это не будет работать на разных платформах.
Однако, обратите внимание на , что getPossibleExePaths
вернет список путей к исполняемым файлам и не обязательно к исполняемому файлу, который запустит процесс. Вам нужно будет выяснить, как ваша программа будет справляться с этим, нет простого способа отделить uninstaller.exe
от launchApp.exe
. Вы можете, конечно, сопоставить место удаления, которое предоставляет winapps
, и исключить его из возвращаемого списка, но это не решает проблему, заключающуюся в том, что это не может быть исполняемым файлом .
Надеюсь, это тебе поможет