| .. _mac-scripting: | |
| ********************* | |
| MacPython OSA Modules | |
| ********************* | |
| This chapter describes the current implementation of the Open Scripting | |
| Architecture (OSA, also commonly referred to as AppleScript) for Python, | |
| allowing you to control scriptable applications from your Python program, | |
| and with a fairly pythonic interface. Development on this set of modules has | |
| stopped. | |
| For a description of the various components of AppleScript and OSA, and to get | |
| an understanding of the architecture and terminology, you should read Apple's | |
| documentation. The "Applescript Language Guide" explains the conceptual model | |
| and the terminology, and documents the standard suite. The "Open Scripting | |
| Architecture" document explains how to use OSA from an application programmers | |
| point of view. In the Apple Help Viewer these books are located in the Developer | |
| Documentation, Core Technologies section. | |
| As an example of scripting an application, the following piece of AppleScript | |
| will get the name of the frontmost :program:`Finder` window and print it:: | |
| tell application "Finder" | |
| get name of window 1 | |
| end tell | |
| In Python, the following code fragment will do the same:: | |
| import Finder | |
| f = Finder.Finder() | |
| print f.get(f.window(1).name) | |
| As distributed the Python library includes packages that implement the standard | |
| suites, plus packages that interface to a small number of common applications. | |
| To send AppleEvents to an application you must first create the Python package | |
| interfacing to the terminology of the application (what :program:`Script Editor` | |
| calls the "Dictionary"). This can be done from within the :program:`PythonIDE` | |
| or by running the :file:`gensuitemodule.py` module as a standalone program from | |
| the command line. | |
| The generated output is a package with a number of modules, one for every suite | |
| used in the program plus an :mod:`__init__` module to glue it all together. The | |
| Python inheritance graph follows the AppleScript inheritance graph, so if a | |
| program's dictionary specifies that it includes support for the Standard Suite, | |
| but extends one or two verbs with extra arguments then the output suite will | |
| contain a module :mod:`Standard_Suite` that imports and re-exports everything | |
| from :mod:`StdSuites.Standard_Suite` but overrides the methods that have extra | |
| functionality. The output of :mod:`gensuitemodule` is pretty readable, and | |
| contains the documentation that was in the original AppleScript dictionary in | |
| Python docstrings, so reading it is a good source of documentation. | |
| The output package implements a main class with the same name as the package | |
| which contains all the AppleScript verbs as methods, with the direct object as | |
| the first argument and all optional parameters as keyword arguments. AppleScript | |
| classes are also implemented as Python classes, as are comparisons and all the | |
| other thingies. | |
| The main Python class implementing the verbs also allows access to the | |
| properties and elements declared in the AppleScript class "application". In the | |
| current release that is as far as the object orientation goes, so in the example | |
| above we need to use ``f.get(f.window(1).name)`` instead of the more Pythonic | |
| ``f.window(1).name.get()``. | |
| If an AppleScript identifier is not a Python identifier the name is mangled | |
| according to a small number of rules: | |
| * spaces are replaced with underscores | |
| * other non-alphanumeric characters are replaced with ``_xx_`` where ``xx`` is | |
| the hexadecimal character value | |
| * any Python reserved word gets an underscore appended | |
| Python also has support for creating scriptable applications in Python, but The | |
| following modules are relevant to MacPython AppleScript support: | |
| .. toctree:: | |
| gensuitemodule.rst | |
| aetools.rst | |
| aepack.rst | |
| aetypes.rst | |
| miniaeframe.rst | |
| In addition, support modules have been pre-generated for :mod:`Finder`, | |
| :mod:`Terminal`, :mod:`Explorer`, :mod:`Netscape`, :mod:`CodeWarrior`, | |
| :mod:`SystemEvents` and :mod:`StdSuites`. |