2011-04-03 15 views
13

¿Puedes crear un servicio Mac OS X con Python? Cómo ?¿Puedes crear un servicio Mac OS X con Python? ¿Cómo?

Lo que quiero hacer es saber enganchar mi Python-fu al sistema de servicio provisto por Mac OS X. ¿Alguien sabe cómo? Si es así, ¿hay algún fragmento de código que funcione? ¿Funcionará solo en texto o también en un objeto definido de tipo mimet?

Service Popup

Respuesta

12
  • abierto Automator.app y crear un nuevo servicio.

  • Seleccione "Utilidades" de la lista de acciones de la izquierda, luego arrastre la acción "Ejecutar script de shell" en el flujo de trabajo.

  • Elija /usr/bin/python como su caparazón.

  • Escriba algún pitón. Por ejemplo:

:

import sys 

for f in sys.stdin: 
    print "Hello World: " + f, 
  • Guardar el servicio como, por ejemplo, "prueba"

  • Pruébalo en TextEdit.app. Escriba texto, seleccione el texto, luego elija TextEdit -> Services -> Test en el menú. Se debe anteponer "Hello World:" a cada línea del texto (según el código Python for f in sys.stdin)

El ejemplo anterior funciona con el texto. Presumiblemente, podría modificarse para funcionar con otros tipos de datos proporcionados a través del sistema de Servicios OS X.

+0

Debe seleccionar la casilla de verificación "Reemplaza el texto seleccionado" para que esto funcione. También solo hará un "Hola mundo"; no uno por cada línea Tendría que dividir 'sys.stdin' en sus líneas componentes para devolver cada línea. – dawg

+0

y dónde se encuentra la casilla de verificación "Reemplaza el texto seleccionado"? –

+0

¿se puede exportar a una aplicación (es decir, .app descargable)? –

2

cómo implementar - Yo diría que hay tres posibilidades:

  1. podría utilizar el Automator y crear un servicio de una acción de ejecución de script de shell.
  2. Puedes escribir una acción de Automator usando Xcode y usar esto en el Automator y crear un nuevo servicio a partir de él. El beneficio sería que podría escribir una IU para ello. Utiliza enlaces para vincularlo al objeto propietario del archivo. Las claves de enlace se reflejan en el script como variables de entorno.
  3. Cree un servicio autónomo o un servicio junto con una aplicación. He implementado uno incluido en la aplicación. Allí también puede definir una interfaz de usuario separada solo para el servicio.

Tipos de entrada: si desea definir el servicio para que solo se muestre si se seleccionan ciertas cosas, como texto o URL, debe definir esto en Info.plist de ese servicio. Creo que debería ser posible editar Info.plist que fue generado por el Automator si desea personalizarlo aún más.

Hay una gran manera de depurar un servicio utilizando TextEdit y se describe en los documentos mencionados a continuación. Proporciona una gran ayuda para depurar por qué un servicio no se muestra en el menú, por ejemplo. Más información se puede encontrar en Apple's service implementation guide

0

Encontré esta página cuando estaba tratando de hacer el servicio de python. Quería compartir mi solución completa para ahorrarles a los demás un poco de tiempo y tal vez obtener retroalimentación de los codificadores más experimentados. Utilicé Preferencias del sistema> Teclado: combinaciones de teclas para establecer un "Orden de corte de aplicación: todas las aplicaciones" para este servicio, de modo que puedo ejecutar el texto seleccionado en cualquier parte del sistema usando command-shift-return. Notará que cualquier excepción hará que la selección sea reemplazada por el texto original. Funciona con UNDO si no obtuvo el resultado que buscaba. Hasta ahora, ¡me gusta mucho!

Crear un flujo de trabajo automator como un servicio, el servicio recibe texto seleccionado en cualquier aplicación, de entrada es la selección toda, de salida reemplaza el texto seleccionado

añadir una acción de secuencia de comandos de ejecución cáscara, cáscara:/usr/bin/pitón de entrada pase : como argumentos

este código va en la caja:

import sys #, random 
try: 
    print eval(' '.join(sys.argv[1:])) 
except: 
try: 
     #This is a compound statement using variable assignment 
     code = compile(' '.join(sys.argv[1:]), '<string>', 'exec') 
     exec code 

    except: 
    print ' '.join(sys.argv[1:]) 

Estos son algunos ejemplos de cómo podría utilizar este servicio. De nuevo, esto funciona en Correo, procesadores de texto y otras aplicaciones.

Muestra 0: matemáticas básicas

>>> 42*24*60*60 
3628800 

Muestra 1: Una sola línea, declaración compuesto

>>> import random; foo = range(17); random.shuffle(foo); print(foo) 
[11, 14, 12, 3, 1, 4, 15, 7, 8, 13, 2, 16, 0, 10, 9, 6, 5] 

Muestra 2: Multiline

>>> import random 
>>> foo = range(17) 
>>> random.shuffle(foo) 
>>> print(foo) 
[5, 16, 14, 10, 3, 11, 7, 15, 12, 0, 13, 2, 4, 1, 6, 9, 8] 

Muestra 3: Bucles

>>> for x in range(5): 
...  print x 
... 
0 
1 
2 
3 
4 
1

Una forma de crear un servicio OS X utilizando Python es agrupar su aplicación Python con py2app y editar el archivo Info.plist para proporcionar las entradas de menú que necesita en el menú Servicio. Puede encontrar un archivo plist de muestra en http://pythonhosted.org/pyobjc/examples/Cocoa/AppKit/SimpleService/index.html Debe crear la funcionalidad para aceptar los comandos que definió en la sección NSMessage de Info.plist (consulte el enlace mencionado anteriormente). Puedes usar PyObjC para hacer esto. Esto es un poco más complicado que usar Automator, pero tiene la ventaja de que puede agrupar toda la funcionalidad en una sola aplicación.