Есть ли способ открыть приложение только по имени в Python - PullRequest
0 голосов
/ 28 мая 2020

Я делаю «Advanced Virtual Assistant», используя Python, и я хочу иметь возможность запускать любое приложение на P C, просто вводя его имя. Что-то вроде:

i = input("What App Do You Want To Open?:  ")
d = getDirectory(i)
os.startfile(d)

Теперь я могу настроить это вручную для некоторых приложений, получив их каталог, но это будет не для каждого приложения, так что это не то, что мне нужно. Есть ли простой способ сделать это?

Ответы [ 4 ]

0 голосов
/ 30 мая 2020

Я написал ниже, в котором используется 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, и исключить его из возвращаемого списка, но это не решает проблему, заключающуюся в том, что это не может быть исполняемым файлом .

Надеюсь, это тебе поможет

0 голосов
/ 29 мая 2020

Из ответа Лукана я получил этот код:

import wmi
w = wmi.WMI()
for p in w.Win32_Product():
    if 'Box, Inc.' == p.Vendor and p.Caption and 'Box Sync' in p.Caption:
        print 'Installed {}'.format(p.Version)

Извините, но я не мог понять, где именно здесь имя приложения go?

0 голосов
/ 29 мая 2020

Для этого уже есть много хороших инструментов.

Вот распространенное решение, которое вы можете попробовать реализовать:

  • Сканируйте или записывайте приложения на вашем P C и хранить записи в базе данных или отформатированном файле. (например, реестр / программные файлы / другие папки)
  • Сопоставьте имя приложения, описание, заголовок или и т.д. c пути к исполняемому файлу приложения. (прочтите информацию о исполняемом файле с помощью wmi или другим способом, как описано в других ответах .)
  • Попробуйте найти введенный текст в полях.
  • (если вы хотите сопоставить естественный язык, это уже другая история.)
  • Используйте Python subprocess или другая функция / lib для запуска исполняемого файла только что найденной записи.
0 голосов
/ 28 мая 2020

Нет простого способа, но вы можете использовать что-то вроде winapps , которое даст вам установочный каталог программы, если он существует. Однако самая сложная часть - это знать, какой файл будет выполнять программу.

Вы можете использовать wmi для получения местоположения, передав информацию из winapps; похож на этот этот ответ , но он может быть устаревшим, поэтому просмотрите / docs / .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...