2007-08-15 11:28:01 -03:00
|
|
|
|
|
|
|
.. _mac-scripting:
|
|
|
|
|
|
|
|
*********************
|
|
|
|
MacPython OSA Modules
|
|
|
|
*********************
|
|
|
|
|
|
|
|
This chapter describes the current implementation of the Open Scripting
|
2008-07-12 17:16:19 -03:00
|
|
|
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
|
2013-02-02 04:14:44 -04:00
|
|
|
stopped.
|
2007-08-15 11:28:01 -03:00
|
|
|
|
|
|
|
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`.
|