有没有一种方法可以在Python中仅通过名称打开应用程序

有没有一种方法可以在Python中仅通过名称打开应用程序,python,python-3.x,windows,Python,Python 3.x,Windows,我正在使用Python制作一个“高级虚拟助手”,我希望能够在PC上运行任何应用程序,只需输入其名称。比如: i = input("What App Do You Want To Open?: ") d = getDirectory(i) os.startfile(d) 现在,我可以通过获取一些应用程序的目录来手动设置这些应用程序,但这不是每个应用程序都需要的,所以这不是我需要的。有什么简单的方法可以做到这一点吗?没有简单的方法,但是您可以使用类似这样的方法来获取程序的安装目录(如果存在)。然

我正在使用Python制作一个“高级虚拟助手”,我希望能够在PC上运行任何应用程序,只需输入其名称。比如:

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

现在,我可以通过获取一些应用程序的目录来手动设置这些应用程序,但这不是每个应用程序都需要的,所以这不是我需要的。有什么简单的方法可以做到这一点吗?

没有简单的方法,但是您可以使用类似这样的方法来获取程序的安装目录(如果存在)。然而,困难的部分是知道哪个文件将执行程序


您可以使用从winapps传入信息来获取位置;与此类似,但可能已经过时了,所以请仔细查看。

从Lucan的回答中,我得到了以下代码:

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)

抱歉,我搞不清楚,应用程序的名称到底在哪里?

已经有很多很好的工具可以做到这一点

以下是您可以尝试实施的常见解决方案:

  • 扫描或录制PC上的应用程序,并将记录存储在数据库或格式化文件中。(例如注册表/程序文件/其他文件夹)
  • 将应用程序名称、说明、标题等映射到应用程序可执行路径。(使用
    wmi
    读取可执行信息,或以其他描述的方式读取可执行信息。)
  • 尝试在字段中查找输入的文本
  • (如果你想要自然语言匹配,那就另当别论了。)
  • 使用Python
    subprocess
    或其他函数/lib运行刚刚找到的记录的可执行文件

我已经写了下面的内容,按照我之前的回答中的建议使用。此实现有许多限制,例如它仅适用于为所有用户安装的程序。但是,您可以修改此代码以使用另一种方式获取安装位置,并使用
getpossibleexepath
获取可执行文件。提供了一些可能优于
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')))
此代码使用窗口的
where
命令,因此不会跨平台工作

但是,请注意,
getPossibleExePaths
将返回可执行路径列表,而不一定是将启动进程的可执行文件。你需要弄清楚你的程序将如何处理这个问题,没有简单的方法将
uninstaller.exe
launchApp.exe
分开。当然,您可以匹配
winapps
提供的卸载位置,并将其从返回列表中排除,但这并不能解决可能不是启动可执行文件的问题


我希望这对您有所帮助

您需要在
HKEY\U LOCAL\U MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall
中提取注册表项,或者使用win32模块提取
win32\U产品
类的列表。您能给我一个如何使用注册表项的示例吗?我认为WMI可能会起作用。我来测试一下。我可以得到一些示例代码吗?我链接到了另一个答案,其中有一个示例,文档中也有很多示例。你可以阅读我发布的内容吗:这在很大程度上是有效的,并且完美地打开了brave和chrome,只使用了它们的名称。由于某些原因,它与所有应用程序都不兼容,因为我的其他应用程序(如discord、fortnite)无法运行它;这只是winapps的一个限制。不过,您不必使用winapps,您可以修改它以使用自己的功能获取安装位置。我会这样做,但正如我所说,我正在构建一个虚拟助手,可以在任何设备上运行。存储数据可能对我有用,但在其他设备上就不行了是的,你是对的。只是想提供一个共同的想法。