ОСX:Определение нового обработчика URL-адресов, указывающего прямо на скрипт Python.

StackOverflow https://stackoverflow.com/questions/2418910

  •  19-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь определить новый обработчик URL-адресов в OSX, который будет указывать на скрипт 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>

Я также использовал Панель дополнительных настроек Интернета указать «dmt» в качестве протокола, но когда я пытаюсь заставить его связать протокол с моим апплетом, он говорит, что «возникла проблема с настройкой приложения в качестве помощника»

Кто-нибудь знает, куда мне идти отсюда?

Спасибо

Это было полезно?

Решение

После долгих возни мне удалось заставить это работать под 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

Третий из них — это идентификатор обработчика, поэтому 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top