2013-04-17 9 views
13

Esiste un modo per eseguire (e ottenere il risultato) codice AppleScript da python senza utilizzare l'utilità della riga di comando appscript (che non desidero utilizzare (credo?) Perché it's no longer developed/supported/recommended)?Chiamare AppleScript da Python senza utilizzare osascript o appscript?

Motivazione: nel another question I've just posted, descrivo uno strano/indesiderato comportamento riscontrato con l'esecuzione di alcuni AppleScript tramite osascript. Come in realtà lo chiamo da uno script python, mi chiedevo se ci fosse un modo per aggirare lo osascript del tutto, dal momento che sembra essere dove si trova il problema - ma l'appscript (la scelta più ovvia?) Sembra rischioso ora ...

+0

Perché non il python [pacchetto osascript] (https://pypi.python.org/pypi/osascript/)? Non era disponibile al momento della domanda? – ecbrodie

+0

Sembra che il progetto [iniziato a ottobre 2015] (https://github.com/russianidiot/osascript.py/commit/33455e1a42f5c3a0361b4f1e5c6952ed8574f0fe), quindi no, non era disponibile nel 2013. Ma sembra buono, Sì grazie! :-) – gimboland

risposta

21

è possibile utilizzare il ponte PyObjC:

>>> from Foundation import * 
>>> s = NSAppleScript.alloc().initWithSource_("tell app \"Finder\" to activate") 
>>> s.executeAndReturnError_(None) 
+0

Grazie! Accettata questa risposta in quanto ha il minor numero di dipendenze, anche se 'py-applescript' sembra anche buono. :-) – gimboland

+0

Potrebbe voler correggere l'ortografia di 'NSApplScript' per aggiungere 'e' dopo 'Appl' - Ho incollato il codice e non ha funzionato la prima volta! – andrewb

+1

@andrewb, fatto. Grazie. –

20

PyPI è tuo amico ...

http://pypi.python.org/pypi/py-applescript

Esempio:

import applescript 

scpt = applescript.AppleScript(''' 
    on run {arg1, arg2} 
     say arg1 & " " & arg2 
    end run 

    on foo() 
     return "bar" 
    end foo 

    on Baz(x, y) 
     return x * y 
    end bar 
''') 

print(scpt.run('Hello', 'World')) #-> None 
print(scpt.call('foo')) #-> "bar" 
print(scpt.call('Baz', 3, 5)) #-> 15 
+0

Grazie - funziona alla grande. Aggiungerò PyPi alla mia lista di cose che dovrei sapere. – gimboland

+0

PyPI è davvero tuo amico. Sempre così utile, sempre così spesso! –

+0

Grazie per l'esempio, aiuta a spiegare è molto più veloce del pacchetto doc. – studgeek

Problemi correlati