Calling Applescript From Python Without Using Osascript Or Appscript?
Is there any way to execute (and obtain the results of) AppleScript code from python without using the osascript command-line utility or appscript (which I don't really want to use
Solution 1:
You can use the PyObjC bridge:
>>>from Foundation import *>>>s = NSAppleScript.alloc().initWithSource_("tell app \"Finder\" to activate")>>>s.executeAndReturnError_(None)
Solution 2:
PyPI is your friend...
http://pypi.python.org/pypi/py-applescript
Example:
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')) #-> Noneprint(scpt.call('foo')) #-> "bar"print(scpt.call('Baz', 3, 5)) #-> 15
Solution 3:
If are looking to execute "Javascript for Automation" (applescript's successor) in your python code, here's how to do it:
script = NonedefcompileScript():
from OSAKit import OSAScript, OSALanguage
scriptPath = "path/to/file.jxa"
scriptContents = open(scriptPath, mode="r").read()
javascriptLanguage = OSALanguage.languageForName_("JavaScript")
script = OSAScript.alloc().initWithSource_language_(scriptContents, javascriptLanguage)
(success, err) = script.compileAndReturnError_(None)
# should only occur if jxa is incorrectly writtenifnot success:
raise Exception("error compiling jxa script")
return script
defexecute():
# use a global variable to cache the compiled script for performanceglobal script
ifnot script:
script = compileScript()
(result, err) = script.executeAndReturnError_(None)
if err:
# example error structure:# {# NSLocalizedDescription = "Error: Error: Can't get object.";# NSLocalizedFailureReason = "Error: Error: Can't get object.";# OSAScriptErrorBriefMessageKey = "Error: Error: Can't get object.";# OSAScriptErrorMessageKey = "Error: Error: Can't get object.";# OSAScriptErrorNumberKey = "-1728";# OSAScriptErrorRangeKey = "NSRange: {0, 0}";# }raise Exception("jxa error: {}".format(err["NSLocalizedDescription"]))
# assumes your jxa script returns JSONreturn json.loads(result.stringValue())
Post a Comment for "Calling Applescript From Python Without Using Osascript Or Appscript?"