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



我正在编写一个跨平台的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的兄弟问题。(

我不知道DOSBox,也不想在我的Mac上使用它,但一般来说,当你在macOS上安装应用程序时,它会有一个"属性列表">文件,或其中的plist"info.plist";束标识符"称为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

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

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

最新更新