OSX:定义一个指向Python脚本的新URL处理器

15 投票
1 回答
6100 浏览
提问于 2025-04-15 20:15

我正在尝试在OSX系统下定义一个新的URL处理程序,让它指向一个Python脚本。

我把这个Python脚本打包成了一个小应用(右键点击.py文件,然后选择“打开方式”->“构建小应用”)。

我在这个小应用的Info.plist文件中添加了以下内容:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <string>Do My Thing</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>dmt</string>
        </array>
    </dict>
</array>

我还使用了More Internet preferences pane来指定“dmt”作为协议,但当我尝试将这个协议链接到我的小应用时,它提示“设置应用为辅助程序时出现问题”。

有人知道我接下来该怎么做吗?

谢谢!

1 个回答

17

经过一番折腾,我终于在OSX上搞定了这个事情……

这是我实现的方法:

在AppleScript的脚本编辑器里,写下以下脚本:

on open location this_URL
    do shell script "/scripts/runLocalCommand.py '" & this_URL & "'"
end open location

如果你想确保从某个特定的shell运行Python(在我的情况下,我通常使用tcsh,并且有一个.tcshrc文件来定义一些我想要使用的环境变量),那么中间那一行可能需要改成:

do shell script "tcsh -c \"/scripts/localCommand.py '" & this_URL & "'\""

我想在一个Python脚本里完成所有实际的处理,但由于OSX中URL处理程序的工作方式,它们必须调用一个应用程序包,而不是直接调用脚本,所以在AppleScript中这样做似乎是最简单的办法。

在脚本编辑器中,选择“另存为”一个“应用程序包”。

找到保存的应用程序包,打开内容。找到Info.plist文件并打开它。添加以下内容:

<key>CFBundleIdentifier</key>
<string>com.mycompany.AppleScript.LocalCommand</string>
<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleURLName</key>
    <string>LocalCommand</string>
    <key>CFBundleURLSchemes</key>
    <array>
      <string>local</string>
    </array>
  </dict>
</array>

在最后两行之前,应该是:

</dict>
</plist>

里面有三个字符串可能需要更改:

com.mycompany.AppleScript.LocalCommand
LocalCommand
local

第三个是处理程序ID,所以一个URL会是local://something。

然后,这个就会传递给Python脚本。

这是我为此准备的:

#!/usr/bin/env python
import sys
import urllib
arg = sys.argv[1]
handler, fullPath = arg.split(":", 1)
path, fullArgs = fullPath.split("?", 1)
action = path.strip("/")
args = fullArgs.split("&")
params = {}
for arg in args:
    key, value = map(urllib.unquote, arg.split("=", 1))
    params[key] = value

撰写回答