2013-04-17 6 views
13

Czy istnieje sposób na wykonanie (i uzyskanie wyników) kodu AppleScript z Pythona bez użycia narzędzia wiersza polecenia osascript lub appscript (którego tak naprawdę nie chcę używać (chyba?), Ponieważ it's no longer developed/supported/recommended)?Wywołanie AppleScript z Pythona bez użycia osascriptu lub appscript?

Uzasadnienie: w another question I've just posted opisuję dziwne/niepożądane zachowanie, którego doświadczam podczas uruchamiania niektórych skryptów AppleScript przez osascript. Ponieważ tak naprawdę wywołuję go ze skryptu python, zastanawiałem się, czy istnieje sposób na trasowanie wokół osascript w ogóle, ponieważ wydaje się, że problem leży - ale appscript (oczywisty wybór?) Wygląda teraz na ryzykowny ...

+0

Dlaczego nie python [pakiet osascript] (https://pypi.python.org/pypi/osascript/)? Czy nie było dostępne w momencie zadawania tego pytania? – ecbrodie

+0

Wygląda jak ten projekt [rozpoczęty w październiku 2015 r.] (Https://github.com/russianidiot/osascript.py/commit/33455e1a42f5c3a0361b4f1e5c6952ed8574f0fe), więc nie, nie był dostępny w 2013 r. Ale wygląda dobrze, Tak, dziękuję! :-) – gimboland

Odpowiedz

21

można użyć mostka PyObjC:

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

Dzięki! Zaakceptowano tę odpowiedź, ponieważ ma ona najmniej zależności, chociaż "py-applescript" również wygląda dobrze. :-) – gimboland

+0

Może zaistnieć potrzeba poprawienia pisowni "NSApplScript", aby dodać "e" po "Appl" - wkleiłem twój kod i nie zadziałało to po raz pierwszy! – andrewb

+1

@andrewb, gotowe. Dzięki. –

20

PyPI jest twoim przyjacielem ...

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

Przykład:

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

Dzięki - działa świetnie. Dodam PyPi do mojej listy rzeczy, o których powinienem wiedzieć. – gimboland

+0

PyPI to rzeczywiście twój przyjaciel. Zawsze tak pomocna, tak często! –

+0

Dzięki za przykład, pomaga wyjaśnić jest o wiele szybciej niż dokument pakietu. – studgeek

Powiązane problemy