[Distutils] Getting an egg's version: better way?

Phillip J. Eby pje at telecommunity.com
Thu Mar 15 17:34:14 CET 2007

At 10:48 AM 3/15/2007 -0400, Nathan R. Yergler wrote:
>I have a situation where I want to get the version of an egg that's
>installed.  I figured out the following, but wanted to know if I'm
>missing something obvious that's easier::
>   >>> import pkg_resources
>   >>> p = pkg_resources.get_provider("cctagutils")
>   >>> for line in p.get_metadata_lines("PKG-INFO"):
>   ...    if line.find('Version: ') == 0:
>   ...      version = line.split()[-1]

The problem with using get_provider() and a module name, is that it cannot 
conclusively associate a package with a specific project.  Thus, your code 
above has a bug: it will not find a version of a package that's installed 
by a system packaging tool such as RPM, or a bdist .exe or .msi on Windows.

You need to use a project name instead of a package/module name, e.g.:

    version = pkg_resources.require('ProjectNameHere')[0].version

This will work even with projects installed using system packaging tools, 
as it explicitly indicates what project's PKG-INFO will be read, if in fact 
it needs to be read at all.  (In most cases, pkg_resources will get the 
project's version number from a filename, without needing to open any files.)

More information about the Distutils-SIG mailing list