#format rst ======================================== Eggs and Buildout Deployment in Python ======================================== .. figure:: http://www.dfwpython.org/static/pycon/distutils-flow.png Figure 1: Data Flow within Distutils/Setuptools Usage Slides: Four-Part In-Depth Presentation Sequence (not presented in class) + `An Introduction to the Virtualenv Sandbox`_ (`.pdf`__, `.txt`__) .. _`An Introduction to the Virtualenv Sandbox`: http://dfwpython.org/static/pycon/0-python-virtualenv.pdf .. __: http://dfwpython.org/static/pycon/0-python-virtualenv.pdf .. __: http://dfwpython.org/static/pycon/0-python-virtualenv.txt + `Distutils: Packaging, Metadata and Pushups`_ (`.pdf`__, `.txt`__) .. _`Distutils: Packaging, Metadata and Pushups`: http://dfwpython.org/static/pycon/1-python-distutils.pdf .. __: http://dfwpython.org/static/pycon/1-python-distutils.pdf .. __: http://dfwpython.org/static/pycon/1-python-distutils.txt + `SetupTools: Python Eggs, Dependencies and Plugins`_ (`.pdf`__, `.txt`__) .. _`SetupTools: Python Eggs, Dependencies and Plugins`: http://dfwpython.org/static/pycon/2-python-setuptools.pdf .. __: http://dfwpython.org/static/pycon/2-python-setuptools.pdf .. __: http://dfwpython.org/static/pycon/2-python-setuptools.txt + `Buildout: Precision Assembly, Repeatability, Islands`_ (`.pdf`__, `.txt`__) .. _`Buildout: Precision Assembly, Repeatability, Islands`: http://dfwpython.org/static/pycon/3-python-buildout.pdf .. __: http://dfwpython.org/static/pycon/3-python-buildout.pdf .. __: http://dfwpython.org/static/pycon/3-python-buildout.txt Condensed Slide Set Used in Actual Tutorial + `Eggs and Buildout Deployment in Python`_ (`.pdf`__, `.txt`__) .. _`Eggs and Buildout Deployment in Python`: http://dfwpython.org/static/pycon/eggs-n-buildout.pdf .. __: http://dfwpython.org/static/pycon/eggs-n-buildout.pdf .. __: http://dfwpython.org/static/pycon/eggs-n-buildout.txt + `Additional Topics of Tutorial`_ (`.pdf`__, `.txt`__) .. _`Additional Topics of Tutorial`: http://dfwpython.org/static/pycon/eggs-n-buildout-bonus.pdf .. __: http://dfwpython.org/static/pycon/eggs-n-buildout-bonus.pdf .. __: http://dfwpython.org/static/pycon/eggs-n-buildout-bonus.txt Exercises from Tutorial: 1. Installing Tools for the Class | $ cd /tmp | $ wget http://peak.telecommunity.com/dist/ez_setup.py | $ sudo python ez_setup.py | $ sudo easy_install virtualenv | $ sudo easy_install zc.buildout 2. Instantiating a Sandbox or Two | $ virtualenv pycon -or- | $ virtualenv --no-site-packages pycon | $ cd pycon | $ bin/python | $ source bin/activate -or- activate.bat | $ deactivate .. + explore: + directory tree + *sys.path* + for each kind of sandbox 3. Processing Distributions 1. Grab a source distribution | $ /sandbox/bin/easy_install --editable --build-directory . SQLObject==0.9.5 | $ /sandbox/bin/easy_install --editable --build-directory . SQLObject==dev Examine its directory structure and common files. 2. Query the list of available distribution formats. | $ cd sqlobject | $ /sandbox/bin/python setup.py sdist --help-formats | $ /sandbox/bin/python setup.py bdist --help-formats 3. Build and package it as a binary distribution. | $ /sandbox/bin/python setup.py build | $ /sandbox/bin/python setup.py install | $ /sandbox/bin/python setup.py bdist --formats=tar,egg,rpm Examine the run output and the table-of-contents of the distribution archive afterward. Note the way that metadata is stored. 4. Repackage it as a source distribution | $ /sandbox/bin/python setup.py sdist --formats=zip Examine the run output and the table-of-contents of the source archive. Note the different way that metadata is stored. 5. Try to import it, then run the "develop" cmd and try again. | $ cd /sandbox | $ /sandbox/bin/python | $ import sqlobject .. | $ cd /sandbox/sqlobject | $ /sandbox/bin/python setup.py develop 4. Generating Scripts that Invokes Entrypoints 1. Create a sandbox in which to work. | $ virtualenv --no-site-packages pycon | $ cd pycon 2. Create a distribution for a new egg that has two scripts. | # File: pycon/setup.py | from setuptools import setup | | setup(name="myscript", | version="1.0.0", | py_module = ['myscript'], | entry_points={ | "console_scripts": [ | "alpha = myscript:alpha_cmd", | "beta = myscript:beta_cmd"] | }, | ) .. | # File: pycon/myscript.py | def alpha_cmd(): | print "Hello from Alpha Centauri" | | class beta_cmd(object): | def __init__(self): | print "Hello from Beta Centauri" 3. Mark it a develop-egg and then add the egg as a 'myscript' part. | # File: pycon/buildout.cfg | [buildout] | develop = . | parts = myscript | | [myscript] | recipe = zc.recipe.egg | eggs = myscript 4. Run *buildout* and look in the bin/ directory for scripts. 5. Create a simple buildout around an egg and experiment with it. 1. Create an empty buildout area. | $ virtualenv --no-site-packages pycon | $ cd pycon | $ buildout init 2. Put into it a simple egg by creating a "buildout.cfg" file: | [buildout] | parts = mypython | prefer-final = true | | [mypython] | recipe = zc.recipe.egg | interpreter = dbpython | eggs = SQLObject 3. Invoke "bin/buildout" and examine the output messages, the directory structure and the *dbpython* script. Test for what version got installed and where it came from. | $ bin/dbpython | >>> import sqlobject | >>> sqlobject.__file__ | '/var/tmp/buildout/eggs/SQLObject-0.10.0-py2.5.egg/sqlobject/__init__.py' 4. Force it to use a specific version of SQLObject. | eggs = SQLObject==0.9 Test for what version got installed and where it came from. | $ bin/dbpython | >>> import sqlobject | >>> sqlobject.__file__ | '/var/tmp/buildout/eggs/SQLObject-0.9.0-py2.5.egg/sqlobject/__init__.py' 5. Remove that constraint and grab its source distribution. | $ bin/easy_install --editable -b . SQLObject Alter "buildout.cfg" file to make it a development egg: | develop = sqlobject Test for what version got installed and where it came from. | $ bin/dbpython | >>> import sqlobject | >>> sqlobject.__file__ | '/tmp/kkk/sqlobject/sqlobject/__init__.py'