有没有一种方法可以按Python中的名称打开应用程序

时间:2020-05-28 12:24:41

标签: python python-3.x windows

我正在使用Python制作“高级虚拟助手”,我希望能够仅输入名称即可在PC上运行任何应用程序。喜欢的东西:

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

现在,我可以通过获取某些应用程序的目录来对其手动进行设置,但它并不适用于每个应用程序,因此不是我所需要的。有没有简单的方法可以做到这一点?

4 个答案:

答案 0 :(得分:0)

没有简单的方法,但是您可以使用winapps之类的东西,如果存在的话,它将获得程序的安装目录。但是,最困难的部分是知道哪个文件将执行程序。

您可以使用wmi通过从winapps传递信息来获取位置;与此this answer类似,但可能已过时,因此请浏览/docs/

答案 1 :(得分:0)

从卢坎的答案中,我得到了以下代码:

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)

对不起,但我无法弄清楚,应用名称到底在哪里?

答案 2 :(得分:0)

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

这是一种常见的解决方案,您可以尝试实现它:

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

答案 3 :(得分:0)

我写了下面的代码,该代码使用了我先前的回答中建议的winapps。此实现有很多限制,例如,它仅适用于为所有用户安装的程序。但是,您可以更改此代码以使用另一种获取安装位置的方式,并使用getPossibleExePaths来获取可执行文件。 This answer提供了一些替代方法,可能比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')))

此代码利用了Window的where命令,因此无法跨平台运行。

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

希望对您有帮助