我正在使用Python制作“高级虚拟助手”,我希望能够仅输入名称即可在PC上运行任何应用程序。喜欢的东西:
i = input("What App Do You Want To Open?: ")
d = getDirectory(i)
os.startfile(d)
现在,我可以通过获取某些应用程序的目录来对其手动进行设置,但它并不适用于每个应用程序,因此不是我所需要的。有没有简单的方法可以做到这一点?
答案 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)
已经有很多好的工具可以做到这一点。
这是一种常见的解决方案,您可以尝试实现它:
wmi
或其他描述的其他方式读取可执行信息。)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.exe
与launchApp.exe
分开。您当然可以匹配winapps
提供的卸载位置,并将其从返回列表中排除,但这不能解决可能不是启动可执行文件的问题。< / p>
希望对您有帮助