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

iyr7buue  于 2023-01-08  发布在  Python
关注(0)|答案(4)|浏览(148)

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

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

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

8nuwlpux

8nuwlpux1#

没有简单的方法,但是你可以使用类似winapps的东西,如果程序存在的话,它会让你得到程序的安装目录。然而,困难的部分是知道哪个文件将执行程序。
您可以使用wmi通过从winapps传递信息来获取位置;类似于这个this answer,但可能是过时的,所以有一个看看通过/docs/

gt0wga4j

gt0wga4j2#

从卢坎的回答中,我得到了这个代码:

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)

对不起,但我想不出来,应用程序的名称到底在哪里?

g6baxovj

g6baxovj3#

已经有很多好的工具可以做到这一点。
以下是您可以尝试实施的常见解决方案:

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

kiayqfof4#

我已经写了下面的代码,它使用了我之前的答案中建议的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')))

此代码使用Windows的where命令,因此无法跨平台运行。
但是,请注意getPossibleExePaths将返回一个可执行文件路径列表,而不一定是启动进程的可执行文件。您需要弄清楚您的程序将如何处理这个问题,没有简单的方法可以将uninstaller.exelaunchApp.exe区分开来。当然,您可以匹配winapps提供的卸载位置,并将其从返回列表中排除,但这无法解决它可能不是启动可执行文件的问题。
希望这对你有帮助

相关问题