2010-03-10 6 views
11

J'essaie de définir un nouveau gestionnaire d'URL sous OSX qui pointe vers un script Python.OSX: Définition d'un nouveau gestionnaire d'URL pointant directement sur un script Python

J'ai enveloppé le script Python vers le haut dans une applet (clic droit sur le py, et allé Ouvrir avec -> Construire Applet)

J'ai ajouté ce qui suit dans Info.plist de l'applet:

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

J'ai aussi utilisé le More Internet preferences pane spécifier « dmt » comme un protocole, mais lorsque je tente de l'obtenir pour relier le protocole à mon applet, il est dit que « il y avait un problème de l'application comme la mise l'aide "

Quelqu'un sait où je devrais aller d'ici?

Merci

Répondre

12

Après beaucoup de déconner, j'ai réussi à obtenir ce travail sous Mac OS X ...

Voilà comment je fais:

dans le script AppleScript rédacteur en chef, écrire le script suivant:

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

Si vous voulez vous assurer que vous utilisez Python à partir d'une certaine coquille (dans mon cas, j'utilise tcsh en général, et un fil .tcshrc e qui définit certaines variables d'environnement que je veux avoir accès à) alors que ligne médiane pourrait vouloir être:

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

je voulais faire tout mon traitement réelle à l'intérieur d'un script python - mais à cause de la manière Les gestionnaires d'URL fonctionnent sous OSX, ils doivent appeler un ensemble d'applications plutôt qu'un script, ce qui semble être le moyen le plus facile de le faire dans AppleScript.

dans l'éditeur de script, Enregistrer sous un « ensemble d'applications »

Trouver l'ensemble d'applications enregistrée et Open Table des matières. Recherchez le fichier Info.plist et ouvrez-le. Ajoutez ce qui suit:

<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> 

Juste avant les deux dernières lignes, ce qui devrait être:

</dict> 
</plist> 

Il y a trois cordes là-dedans qui pourraient vouloir changer:

com.mycompany.AppleScript.LocalCommand 
LocalCommand 
local 

Les le troisième d'entre eux est l'ID du gestionnaire - donc une URL serait locale: // quelque chose

Alors, alors cela passe ove r au script Python.

C'est ce que j'ai pour cela:

#!/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 
+0

Vous pouvez également utiliser py2app pour découper le bit AppleScript, je crois. – spieden

+1

Avez-vous depuis trouvé un moyen plus facile de faire cela? Cela semble être un processus assez complexe. En outre, je construis un '.app' en Python qui voudrait utiliser un rappel de rappel de protocole personnalisé pour l'autorisation avec un service web.Contrairement à l'exécution d'un script Python, je m'attends à ce qu'une instance de l'application s'exécute au moment où l'appel de protocole est effectué. Comment puis-je m'assurer qu'il est géré par l'instance ouverte de l'application? – fatuhoku

+0

@fatuhoku l'application doit détecter qu'elle est déjà en cours d'exécution et transmettre la requête via une sorte d'ipc. –