OSX: Определение нового обработчика URL, который указывает прямо на сценарий Python

Я пытаюсь определить новый обработчик URL под OSX, который укажет на сценарий Python.

Я обернул сценарий Python в апплет (щелкнутый правой кнопкой на .py, и уведенный Открывают With-> Build Applet),

Я добавил следующее в Info.plist апплета:

CFBundleURLTypes

    
        CFBundleURLName
        Do My Thing
        CFBundleURLSchemes
        
            dmt
        
    

Я также использовал Больше интернет-предпочтительной области для определения "dmt" как протокола, но когда я пытаюсь заставить это связывать протокол с моим апплетом, это говорит, что "Была проблема, устанавливающая приложение как помощник"

Кто-либо знает, куда я должен пойти отсюда?

Спасибо

11
задан Hugh 10 March 2010 в 17:09
поделиться

1 ответ

После долгого возиться, мне удалось заставить это работать под 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 - но из-за того, как работают URL хендеры в OSX, они должны вызывать пакет приложений, а не скрипт, поэтому сделать это в 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
13
ответ дан 3 December 2019 в 08:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: