После долгих раздумий мне удалось заставить это работать под OSX ...
Вот как я это делаю:
в редакторе скриптов AppleScript напишите следующий скрипт:
on open location this_URL
do shell script "/scripts/runLocalCommand.py '" & this_URL & "'"
end open location
Если вы хотите убедиться, что вы запускаете 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
Третий из них - идентификатор обработчика, поэтому URL будет локальным: // что-то
Итак, это переходит к скрипту 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