如何通过应用名称在 macOS 上以编程方式打开应用程序?

6

我正在编写一款跨平台的 Python 应用程序,作为 DOSBox 的前端。它需要使用多个命令行参数来调用 DOSBox 可执行文件。我不想硬编码指定 DOSBox 的路径,因为这可能取决于用户安装的位置。

在 Linux 上,我可以简单地执行以下操作:

import subprocess
subprocess.run(['dosbox'] + args)

然而,在 macOS 上,我目前使用以下代码:

import subprocess
subprocess.run(['/Applications/dosbox.app/Contents/MacOS/DOSBox'] + args)

这似乎非常具体,而且我甚至不确定它是否有效,因为我没有Mac进行测试。

在macOS上按名称打开应用程序的正确方法是什么?

(注意:我也针对Windows提出了类似问题。)


subprocess.call(['open','Path/To/Application']) - Jacky
谢谢,我已经澄清了问题。 - Jaap Joris Vens
既然您在Linux上依赖于应用程序在PATH上,为什么不在Mac上也这样做呢? - MisterMiyagi
因为与Linux不同,dosbox在macOS上没有添加到PATH中。 - Jaap Joris Vens
2个回答

5

我不知道什么是DOSBox,也不知道如何在Mac上安装它,但一般情况下,在macOS上安装应用程序时,它会有一个属性列表文件,或称为plist"info.plist"。在该文件中,开发者应该放置一个名为"bundle identifier"的键,并将其命名为CFBundleIdentifier。这个键必须在所有应用程序中保持唯一性,所以对于DOSBox来说,它应该是类似这样的东西:

<key>CFBundleIdentifier</key>
<string>com.dosboxinc.dosbox</string>

让您的一个用户去找到它,然后您可以使用捆绑标识符来打开它,而不用考虑安装位置:

open -b BUNDLEIDENTIFIER --args arg1 arg2 arg3

这里的arg1arg2arg3会传递给DOSBox


你可以尝试在终端中运行以下命令来获取捆绑标识符:

osascript -e 'id of app "DOSBox"'

请注意,如果这个命令能够工作,那么这意味着我正确地猜出了应用程序的名称"DOSBox",这意味着您可以直接使用应用程序的名称open,而不是像这样使用软件包标识符:
open -a DOSBox --args arg1 arg2 arg3

请问您(或其他人)是否可以帮忙安装DOSBox一下,只是为了检查一下open -a DOSBox命令是否可用? - Jaap Joris Vens

0

大多数Mac上的应用程序都保存在/Applications中,因此/Applications/dosbox.app/Contents/MacOS/DOSBox似乎是大部分时间我认为可执行文件的正确文件路径。 我确实尝试在我的Mac上安装DOSBox,应用程序通常称为DOSBox.app。

虽然可以将应用程序放在任何地方,但Mac用户理论上可能会这样做,这可能意味着使用os.walk来查找它的方式。 我不知道macOS中查找应用程序的方法,除了递归搜索之外,这也是系统在需要时执行的方式。 我会尝试使用os.path.isfile来检查可执行文件是否存在于通常位置,然后在目录〜中搜索该文件。 当前用户目录以外的目录不太可能包含此应用程序。


我不相信对文件系统进行彻底搜索是正确的答案。一定有一种方法只搜索已安装的程序。 - Jaap Joris Vens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接