2011-04-03 16 views
13

È possibile creare un servizio Mac OS X con Python? Come ?Puoi creare un servizio Mac OS X con Python? Come?

Quello che voglio fare è sapere collegare il mio Python-fu al sistema di servizio fornito da Mac OS X. Qualcuno sa come? Se sì qualche frammento di codice funzionante? Funzionerà solo sul testo o anche su un determinato oggetto definito dal mimetype?

Service Popup

risposta

12
  • Aprire Automator.app e creare un nuovo servizio.

  • Selezionare "Utilità" dall'elenco delle azioni a sinistra, quindi trascinare l'azione "Esegui script shell" nel flusso di lavoro.

  • Scegliere /usr/bin/python come shell.

  • Digitare un po 'di pitone. Per esempio:

:

import sys 

for f in sys.stdin: 
    print "Hello World: " + f, 
  • Salva il servizio come, ad esempio, "Test"

  • Provalo in TextEdit.app. Digita del testo, seleziona il testo, quindi seleziona TextEdit -> Servizi -> Test dal menu. Esso dovrebbe anteporre "Ciao Mondo:" per ogni riga del testo (come per il codice Python for f in sys.stdin)

L'esempio precedente funziona con il testo. Presumibilmente, potrebbe essere modificato per funzionare con altri tipi di dati forniti tramite il sistema OS X Services.

+0

È necessario selezionare la casella di controllo "Sostituisci testo selezionato" affinché funzioni. Farà anche solo un "Hello World"; non uno per ogni linea. Dovresti dividere 'sys.stdin' nelle sue linee componenti per restituire ogni riga. – dawg

+0

e dove si trova la casella di controllo "Sostituisci testo selezionato"? –

+0

può essere esportato in un'applicazione (ad esempio scaricabile .app)? –

2

come implementare - direi che ci sono tre possibilità:

  1. è possibile utilizzare l'Automator e creare un servizio da un'azione di script di shell corsa.
  2. È possibile scrivere un'azione Automator da soli utilizzando Xcode e utilizzarlo in Automator e creare un nuovo servizio. Il vantaggio sarebbe che potresti scrivere un'interfaccia utente per questo. Utilizzi i collegamenti per associarli all'oggetto proprietario del file. Le chiavi di associazione vengono quindi riflesse nello script come variabili di ambiente.
  3. Creare un servizio autonomo o un servizio associato a un'applicazione. Ne ho implementato uno incluso nell'applicazione. Lì puoi anche definire un'interfaccia utente separata solo per il servizio.

Tipi di input: se si desidera definire il servizio in modo che venga visualizzato solo se alcune cose sono selezionate, come testo o URL, lo si definirà nel file Info.plist del servizio. Penso che dovrebbe essere possibile modificare Info.plist che è stato generato da Automator se si desidera personalizzare ulteriormente.

Esiste un ottimo modo per eseguire il debug di un servizio utilizzando TextEdit ed è descritto nei documenti indicati di seguito. Ad esempio, fornisce un valido aiuto per eseguire il debug del motivo per cui un servizio non viene visualizzato nel menu. Ulteriori informazioni possono essere trovate in Apple's service implementation guide

0

Ho trovato questa pagina quando stavo cercando di fare il servizio python. Volevo condividere la mia soluzione completa per risparmiare un po 'di tempo agli altri e magari ottenere un feedback dai programmatori più esperti. Ho usato Preferenze di sistema> Tastiera: Associazioni di tasti per impostare un "Ordine di ordinamento delle applicazioni: Tutte le app" per questo servizio in modo da poter eseguire il testo selezionato in qualsiasi punto del sistema utilizzando command-shift-return. Si noterà che eventuali eccezioni causeranno la sostituzione della selezione con il testo originale. Funziona con UNDO se non hai ottenuto il risultato desiderato. Finora mi piace molto!

Creare un flusso di lavoro automator come servizio, servizio riceve testo selezionato in qualsiasi applicazione, ingresso è intera selezione, uscita sostituisce il testo selezionato

Aggiungere un guscio corsa azione script shell:/usr/bin/ingresso passaggio pitone : come argomenti

questo codice va nella scatola:

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:]) 

Questi sono alcuni esempi di come potrei utilizzare questo servizio. Ancora una volta, questo funziona in Mail, word processor e altre app.

Esempio 0: Basic Math

>>> 42*24*60*60 
3628800 

Esempio 1: Linea singola, istruzione composta

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

Esempio 2: multilinea

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

Esempio 3: Loops

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

Un modo per creare un servizio OS X utilizzando Python consiste nel raggruppare l'app Python con py2app e modificare il file Info.plist per fornire le voci di menu necessarie nel menu Servizio. Un file plist di esempio può essere trovato in http://pythonhosted.org/pyobjc/examples/Cocoa/AppKit/SimpleService/index.html È necessario creare la funzionalità per accettare i comandi definiti nella sezione NSMessage di Info.plist (vedere il collegamento menzionato sopra). Puoi usare PyObjC per fare questo. Questo è un po 'più complicato rispetto all'utilizzo di Automator, ma ha il vantaggio di poter unire l'intera funzionalità in un'unica App.