2010-03-10 12 views
11

Sto provando a definire un nuovo gestore di URL in OSX che punti a uno script python.OSX: definizione di un nuovo gestore di URL che punta direttamente su uno script Python

ho avvolto lo script Python su in un applet (click destro sul Py, e andato Apri con -> Crea Applet)

ho aggiunto quanto segue nella Info.plist dell'applet:

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

ho anche usato il More Internet preferences pane per specificare "DMT" come un protocollo, ma quando provo a farlo per collegare il protocollo al mio applet, si dice che "C'è stato un impostando l'applicazione come problema l'aiutante "

Qualcuno sa dove dovrei andare da qui?

Grazie

risposta

12

Dopo un sacco di fare in giro, sono riuscito a ottenere questo lavoro sotto OSX ...

Questo è come lo sto facendo:

nello script AppleScript Editor, scrivere il seguente script:

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

Se si vuole fare in modo che si sta eseguendo il Python da un certo shell (nel mio caso, sto usando tcsh in generale, e hanno un fil .tcshrc e che definisce alcune variabili d'ambiente che vogliono avere accesso a) allora che la linea di mezzo potrebbe desiderare di essere:

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

Mi mancava di fare tutto il mio trattamento reale all'interno di uno script python - ma a causa del modo in cui I gestori di URL funzionano in OSX, devono chiamare un pacchetto di applicazioni piuttosto che uno script, quindi farlo in AppleScript sembra essere il modo più semplice per farlo.

in Script Editor, salvare come "Application Bundle"

Trova i salvati Application Bundle, e contenuto aperto. Trova il file Info.plist e aprilo. Aggiungere il seguente:

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

Poco prima che le ultime due righe, che dovrebbero essere:

</dict> 
</plist> 

Ci sono tre stringhe in là che potrebbero voler essere cambiato:

com.mycompany.AppleScript.LocalCommand 
LocalCommand 
local 

I terzo di questi è l'ID del gestore - quindi un URL sarebbe locale: // qualcosa

Quindi, quindi questo passa ove r allo script Python.

Questo è quello che ho per questo:

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

Si potrebbe anche usare py2app per tagliare fuori la punta AppleScript, credo. – spieden

+1

Hai trovato un modo più semplice per farlo? Sembra ancora un processo abbastanza coinvolto. Inoltre, sto costruendo un '.app' di Python che vorrebbe usare un callback del protocollo di callback personalizzato per l'autorizzazione con un servizio web.A differenza della semplice esecuzione di uno script Python, mi aspetto che un'istanza dell'applicazione sia in esecuzione al momento della chiamata al protocollo. Come posso assicurarmi che venga gestito dall'istanza aperta dell'applicazione? – fatuhoku

+0

@fatuhoku l'applicazione deve rilevare che è già in esecuzione e inoltrare la richiesta tramite una sorta di ipc. –

Problemi correlati