[Distutils] Specifying version information once
a.cavallo at cavallinux.eu
Wed May 20 13:37:19 CEST 2009
> > Or my preferred way:
> > $cat foobar/__init__.py
> > __version__ = "0.9.33"
> > and import foobar should not trigger code execution anyway IMHO so
> > $ python -c 'import foobar; print foobar.__version__'
> > 0.9.33
> That doesn't work in all cases.
No it is not that the case and I'm going to bore you probably (sorry).
The "source" dir where the module foobar is located:
$> cat ~someuser/foobar-1.0/foobar/__init__.py
__version__ = "1.0"
Assume the previous module is installed already under:
$> cat /usr/lib/python2.5/site-lib/foobar/__init__.py
__version__ = "0.9"
(please note the site-lib subidr, where all the module not belonging to the
python standard library are located).
$~someuser/foobar-1.0/> python -c 'import foobar; print foobar.__version__'
This return (or it does on my python interpreter): "1.0" not "0.9"
The case is different for the standard libraries, in fact:
$~someuser> touch os.py
$~someuser> python -c 'import os; print os.__file__'
this will return: /usr/lib/python2.5/os.py(c)
There's no need to have foobar "installed" to reflect the correct __version__.
Then we need to agree on what do we mean for install and packaging....
"python setup.py install", "python setup.py bdist_rpm/wininst" or during a
complete deb/rpm package build?
In the latter the version the "version" is the one available in the spec/deb
files and it cannot be reflected from the sources anyway, no matter how hard
one try to do it.
> Your example is of an external query of
> the version of an installed module. You also need to query the version
> -before- it is installed (during the packaging phase) on sys.path, and also
> from -within- the foobar module itself. Your code does not handle those
> cases. An attempt to 'import foobar; print foobar.__version__' from a
> setup.py inside foobar won't find foobar.
Finding modules can always be forced using PYTHONPATH (like in case of
foobar-1.0/src/foobar layout) or from setup.py inserting into sys.path the
subdir: that's the easiest and in my opinion the best way to do it during
More information about the Distutils-SIG