The simplest possible setup.py script to build a py2app application looks like the following:
"""
py2app build script for MyApplication
Usage:
python setup.py py2app
"""
from setuptools import setup
setup(
app=["MyApplication.py"],
setup_requires=["py2app"],
)
The py2applet script can create setup.py files of this variety for you automatically:
$ py2applet --make-setup MyApplication.py
For ease of distribution, you may wish to have your setup.py script automatically ensure that setuptools is installed. This requires having a copy of ez_setup in your project, which can be obtained from here:
http://peak.telecommunity.com/dist/ez_setup.py
Or it may be referenced from svn:externals as such:
ez_setup svn://svn.eby-sarna.com/svnroot/ez_setup
If choosing the svn:externals approach you should consider that your project’s source code will depend on a third party, which has reliability and security implications. Also note that the ez_setup external uses the svn:// protocol (TCP port 3690) rather than http:// so it is somewhat less likely to work behind some firewalls or proxies.
Once this is done, you simply add the two line ez_setup preamble to the very beginning of your setup.py:
"""
py2app build script for MyApplication.
Will automatically ensure that all build prerequisites are available
via ez_setup.
Usage:
python setup.py py2app
"""
import ez_setup
ez_setup.use_setuptools()
from setuptools import setup
setup(
app=["MyApplication.py"],
setup_requires=["py2app"],
)
Cross-platform applications can share a setup.py script for both py2exe and py2app. Here is an example Self-bootstrapping setup.py that will build an application on Windows or Mac OS X:
"""
py2app/py2exe build script for MyApplication.
Will automatically ensure that all build prerequisites are available
via ez_setup
Usage (Mac OS X):
python setup.py py2app
Usage (Windows):
python setup.py py2exe
"""
import ez_setup
ez_setup.use_setuptools()
import sys
from setuptools import setup
mainscript = 'MyApplication.py'
if sys.platform == 'darwin':
extra_options = dict(
setup_requires=['py2app'],
app=[mainscript],
# Cross-platform applications generally expect sys.argv to
# be used for opening files.
options=dict(py2app=dict(argv_emulation=True)),
)
elif sys.platform == 'win32':
extra_options = dict(
setup_requires=['py2exe'],
app=[mainscript],
)
else:
extra_options = dict(
# Normally unix-like platforms will use "setup.py install"
# and install the main script as such
scripts=[mainscript],
)
setup(
name="MyApplication",
**extra_options
)