2013-04-17 2 views
13

Есть ли способ выполнить (и получить результаты) код AppleScript из python без использования служебной программы командной строки osascript или appscript (что я действительно не хочу использовать (я думаю?), Потому что it's no longer developed/supported/recommended)?Вызов AppleScript с Python без использования osascript или appscript?

Обоснование: в another question I've just posted, я описываю странное/нежелательное поведение, с которым я столкнулся с запуском AppleScript через osascript. Поскольку я на самом деле вызываю это из сценария python, я задавался вопросом, есть ли способ маршрутизировать вокруг osascript вообще, так как это похоже на то, где проблема, но appcript (очевидный выбор?) Теперь выглядит рискованным ...

+0

Почему не python [пакет osascript] (https://pypi.python.org/pypi/osascript/)? Был ли он недоступен в тот момент, когда задавался этот вопрос? – ecbrodie

+0

Похоже, что этот проект [начался в октябре 2015 года] (https://github.com/russianidiot/osascript.py/commit/33455e1a42f5c3a0361b4f1e5c6952ed8574f0fe), поэтому нет, он не был доступен в 2013 году. Но он выглядит хорошо, Да, спасибо! :-) – gimboland

ответ

21

Вы можете использовать PyObjC мост:

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

Спасибо! Принимал этот ответ, поскольку он имеет наименьшее количество зависимостей, хотя 'py-applescript' также выглядит хорошо. :-) – gimboland

+0

Можете исправить написание «NSApplScript», чтобы добавить «e» после «Appl» - я вставил ваш код, и он не работал в первый раз! – andrewb

+1

@andrewb, сделано. Благодарю. –

20

PyPI твой друг ...

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

Пример:

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

Спасибо - отлично работает. Добавьте PyPi в список, о котором я должен знать. – gimboland

+0

PyPI действительно ваш друг. Всегда так полезно, так часто! –

+0

Спасибо, например, объясняет это намного быстрее, чем пакет doc. – studgeek

Смежные вопросы