
:mod:`MacOS` --- Access to Mac OS interpreter features
======================================================

.. module:: MacOS
   :platform: Mac
   :synopsis: Access to Mac OS-specific interpreter features.


This module provides access to MacOS specific functionality in the Python
interpreter, such as how the interpreter eventloop functions and the like. Use
with care.

Note the capitalization of the module name; this is a historical artifact.


.. data:: runtimemodel

   Always ``'macho'``, from Python 2.4 on. In earlier versions of Python the value
   could also be ``'ppc'`` for the classic Mac OS 8 runtime model or ``'carbon'``
   for the Mac OS 9 runtime model.


.. data:: linkmodel

   The way the interpreter has been linked. As extension modules may be
   incompatible between linking models, packages could use this information to give
   more decent error messages. The value is one of ``'static'`` for a statically
   linked Python, ``'framework'`` for Python in a Mac OS X framework, ``'shared'``
   for Python in a standard Unix shared library. Older Pythons could also have the
   value ``'cfm'`` for Mac OS 9-compatible Python.


.. exception:: Error

   .. index:: module: macerrors

   This exception is raised on MacOS generated errors, either from functions in
   this module or from other mac-specific modules like the toolbox interfaces. The
   arguments are the integer error code (the :cdata:`OSErr` value) and a textual
   description of the error code. Symbolic names for all known error codes are
   defined in the standard module :mod:`macerrors`.


.. function:: GetErrorString(errno)

   Return the textual description of MacOS error code *errno*.


.. function:: DebugStr(message [, object])

   On Mac OS X the string is simply printed to stderr (on older Mac OS systems more
   elaborate functionality was available), but it provides a convenient location to
   attach a breakpoint in a low-level debugger like :program:`gdb`.


.. function:: SysBeep()

   Ring the bell.


.. function:: GetTicks()

   Get the number of clock ticks (1/60th of a second) since system boot.


.. function:: GetCreatorAndType(file)

   Return the file creator and file type as two four-character strings. The *file*
   parameter can be a pathname or an ``FSSpec`` or  ``FSRef`` object.


.. function:: SetCreatorAndType(file, creator, type)

   Set the file creator and file type. The *file* parameter can be a pathname or an
   ``FSSpec`` or  ``FSRef`` object. *creator* and *type* must be four character
   strings.


.. function:: openrf(name [, mode])

   Open the resource fork of a file. Arguments are the same as for the built-in
   function :func:`open`. The object returned has file-like semantics, but it is
   not a Python file object, so there may be subtle differences.


.. function:: WMAvailable()

   Checks whether the current process has access to the window manager. The method
   will return ``False`` if the window manager is not available, for instance when
   running on Mac OS X Server or when logged in via ssh, or when the current
   interpreter is not running from a fullblown application bundle. A script runs
   from an application bundle either when it has been started with
   :program:`pythonw` instead of :program:`python` or when running  as an applet.

