2010-03-10 15 views
11

Estoy tratando de definir un nuevo controlador de URL bajo OSX que apunte a un script de python.OSX: Definición de un nuevo controlador de URL que apunta directamente a un script de Python

me he envuelto la secuencia de comandos de Python para arriba en un applet (derecha-clic en el .py, y ha ido Abrir con -> Construir applet)

He añadido lo siguiente en Info.plist del applet:

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

también he utilizado el More Internet preferences pane para especificar "dmt" como protocolo, pero cuando trato de conseguirlo para enlazar el protocolo a mi applet, se dice que "Hubo un problema al configurar la aplicación como el ayudante "

¿Alguien sabe a dónde debo ir desde aquí?

Gracias

Respuesta

12

Después de mucho andar por ahí, que las han arreglado para conseguir este trabajo en OSX ...

Así es como lo estoy haciendo:

en la secuencia de comandos AppleScript editor, escriba el siguiente script:

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

Si desea asegurarse de que está ejecutando el pitón de un determinado depósito (en mi caso, estoy usando tcsh general, y tienen un fil .tcshrc e que define algunas variables de entorno que quieren tener acceso a), entonces esa línea media podría querer ser:

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

yo quería hacer todo de mi procesamiento real dentro de un script en Python - pero debido a la forma Los desarrolladores de URL trabajan en OSX, tienen que llamar a un paquete de aplicaciones en lugar de un script, por lo que hacerlo en AppleScript parece ser la forma más fácil de hacerlo.

en el Editor de secuencias de comandos, guardar como "paquete de aplicaciones"

Encuentra los salvados paquete de aplicaciones y contenidos abiertos. Busque el archivo Info.plist y ábralo. Agregue el siguiente:

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

Justo antes de las dos últimas líneas, que deben ser:

</dict> 
</plist> 

Hay tres cadenas de ahí que quieran ser cambiado:

com.mycompany.AppleScript.LocalCommand 
LocalCommand 
local 

Los el tercero de estos es la ID del manejador, por lo que una URL sería local: // algo

Entonces, esto pasa r a la secuencia de comandos de Python.

Esto es lo que tengo para esto:

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

También es posible usar py2app para cortar el bit de AppleScript, creo. – spieden

+1

¿Desde entonces ha encontrado una manera más fácil de hacer esto? Parece un proceso bastante complicado aún. Además, estoy construyendo un '.app' fuera de Python que quisiera utilizar una devolución de llamada de protocolo de devolución de llamada personalizada para la autorización con un servicio web.A diferencia de simplemente ejecutar un script de Python, espero que una instancia de la aplicación se ejecute en el momento en que se realiza la llamada al protocolo. ¿Cómo me aseguro de que sea manejado por la instancia abierta de la aplicación? – fatuhoku

+0

@fatuhoku la aplicación necesita detectar que ya se está ejecutando y reenviar la solicitud a través de algún tipo de ipc. –

Cuestiones relacionadas