The technique I've used most is to have a 'make-release' script that takes the repository path or tag, picks the version out of the path or tag, exports the project, inserts the version into the right places (setup.py here), and creates the release tarball and whatnot. I have an older version of the script (my pre-Python days!) with a CVS mini-HOWTO with the whole release process, http://bitsko.slc.ut.us/~ken/make-rel/
buildutils has several of these features, though I haven't used them all (I use setuptools' PyPI uploading, and don't bother with the announce feature in buildutils either).
I actually want the checkout to be usable -- which means a proper version (which becomes much more important with setuptools and python setup.py develop), so the version fixup has to happen in the repository, not just at build time. There's still versions in the documentation, though. Some of these are unresolveable by any automated process (e.g., NEWS).
Anyway, with buildutils it's a pretty clean release process:python setup.py svntag --version=0.4.1 --next-version=0.4.2 cd ../Package-0.4.1 python setup.py register python setup.py sdist upload # Then the documentation: python setup.py pudge publish# Ian Bicking