I’m trying to port an open-source library to Python 3. (SymPy, if anyone is wondering.)
So, I need to run 2to3
automatically w
I’m a distutils maintainer and distutils2/packaging contributor. I did a talk about Python packaging at ConFoo 2011 and these days I’m writing an extended version of it. It’s not published yet, so here are excerpts that should help define things.
Distutils is the standard tool used for packaging. It works rather well for simple needs, but is limited and not trivial to extend.
Setuptools is a project born from the desire to fill missing distutils functionality and explore new directions. In some subcommunities, it’s a de facto standard. It uses monkey-patching and magic that is frowned upon by Python core developers.
Distribute is a fork of Setuptools that was started by developers feeling that its development pace was too slow and that it was not possible to evolve it. Its development was considerably slowed when distutils2 was started by the same group. 2013-August update: distribute is merged back into setuptools and discontinued.
Distutils2 is a new distutils library, started as a fork of the distutils codebase, with good ideas taken from setup tools (of which some were thoroughly discussed in PEPs), and a basic installer inspired by pip. The actual name you use to import Distutils2 is Distutils2 did not make the Python 3.3 release, and it was put on hold.packaging
in the Python 3.3+ standard library, or distutils2
in 2.4+ and 3.1–3.2. (A backport will be available soon.)
More info:
I hope to finish my guide soon, it will contain more info about each library’s strong and weak points and a transition guide.
As of March 2020, most of the other answers to this question are several years out-of-date. When you come across advice on Python packaging issues, remember to look at the date of publication, and don't trust out-of-date information.
The Python Packaging User Guide is worth a read. Every page has a "last updated" date displayed, so you can check the recency of the manual, and it's quite comprehensive. The fact that it's hosted on a subdomain of python.org of the Python Software Foundation just adds credence to it. The Project Summaries page is especially relevant here.
Here's a summary of the Python packaging landscape:
distutils
is still the standard tool for packaging in Python. It is included in the standard library (Python 2 and Python 3). It is useful for simple Python distributions, but lacks features. It introduces the distutils
Python package that can be imported in your setup.py
script.
setuptools
was developed to overcome Distutils' limitations, and is not included in the standard library. It introduced a command-line utility called easy_install
. It also introduced the setuptools
Python package that can be imported in your setup.py
script, and the pkg_resources
Python package that can be imported in your code to locate data files installed with a distribution. One of its gotchas is that it monkey-patches the distutils
Python package. It should work well with pip
. It sees regular releases.
scikit-build
is an improved build system generator that internally uses CMake to build compiled Python extensions. Because scikit-build isn't based on distutils, it doesn't really have any of its limitations. When ninja-build is present, scikit-build can compile large projects over three times faster than the alternatives. It should work well with pip
.
distlib
is a library that provides functionality that is used by higher level tools like pip
.
packaging
is also a library that provides functionality used by higher level tools like pip
and setuptools
distribute
was a fork of setuptools
. It shared the same namespace, so if you had Distribute installed, import setuptools
would actually import the package distributed with Distribute. Distribute was merged back into Setuptools 0.7, so you don't need to use Distribute any more. In fact, the version on Pypi is just a compatibility layer that installs Setuptools.
distutils2
was an attempt to take the best of distutils
, setuptools
and distribute
and become the standard tool included in Python's standard library. The idea was that distutils2
would be distributed for old Python versions, and that distutils2
would be renamed to packaging
for Python 3.3, which would include it in its standard library. These plans did not go as intended, however, and currently, distutils2
is an abandoned project. The latest release was in March 2012, and its Pypi home page has finally been updated to reflect its death.
There are other tools, if you are interested, read Project Summaries in the Python Packaging User Guide. I won't list them all, to not repeat that page, and to keep the answer matching the question, which was only about distribute
, distutils
, setuptools
and distutils2
.
If all of this is new to you, and you don't know where to start, I would recommend learning setuptools
, along with pip
and virtualenv
, which all work very well together.
If you're looking into virtualenv
, you might be interested in this question: What is the difference between venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, etc?. (Yes, I know, I groan with you.)
NOTE: Answer deprecated, Distribute now obsolete. This answer is no longer valid since the Python Packaging Authority was formed and has done a lot of work cleaning this up.
Yep, you got it. :-o I think at this time the preferred package is Distribute, which is a fork of setuptools, which are an extension of distutils (the original packaging system). Setuptools was not being maintained so is was forked and renamed, however when installed it uses the package name of setuptools! I think most Python developers now use Distribute, and I can say for sure that I do.
Updating this question in late 2014 where fortunately the Python packaging chaos has been greatly cleaned up by Continuum's "conda" package manager.
In particular, conda quickly enables the creation of conda "environments". You can configure your environments with different versions of Python. For example:
conda create -n py34 python=3.4 anaconda
conda create -n py26 python=2.6 anaconda
will create two ("py34" or "py26") Python environments with different versions of Python.
Afterwards you can invoke the environment with the specific version of Python with:
source activate <env name>
This feature seems especially useful in your case where you are having to deal with different version of Python.
Moreover, conda has the following features:
That last point is especially important if you are in the scientific computing arena.
I realize that I have replied to your secondary question without addressing unquestioned assumptions in your original problem:
I'm trying to port an open-source library (SymPy, if anyone is wondering) to Python 3. To do this, I need to run 2to3 automatically when building for Python 3.
You may, not need. Other strategies are described at http://docs.python.org/dev/howto/pyporting
To do that, I need to use distribute,
You may :) distutils supports build-time 2to3 conversion for code (not docstrings), in a different manner that distribute’s: http://docs.python.org/dev/howto/pyporting#during-installation