How to access python package metadata from within the python console?

Viewed 12384

If I have built a python package employing distutils.core, e.g. via

setup(
    ext_package="foo",
    author="me",
    version="1.0",
    description="foo package",
    packages=["foo",],
)

where does all the metadata go (what is it intended for?) and how can I access it from within python. Specifically, how can I access the author information from the python console after doing something like

>>> import foo
7 Answers

With python3.8 being released, you might want to use the new importlib.metadata[1] module to parse any installed package's metadata.

Getting the author information would look like this:

>>> from importlib import metadata
>>> metadata.metadata('foo')['Author']  # let's say you called your package 'foo'
'Arne'

And getting the version of your install:

>>> from importlib import metadata
>>> metadata.version('foo')
'0.1.0'

Which is a lot more straight forward than what you had to do before.


[1] Also available as backport for Python2.7 and 3.5+ as importlib-metadata, thanks to @ChrisHunt for pointing that out.

Concerning the version metadata only, I found it quite unreliable to use the various tools available as most of them do not cover all cases. For example

  • built-in modules
  • modules not installed but just added to the python path (by your IDE for example)
  • two versions of the same module available (one in python path superseding the one installed)

Since we needed a reliable way to get the version of any package, module or submodule, I ended up writing getversion. It is quite simple to use:

from getversion import get_module_version
import foo
version, details = get_module_version(foo)

See the documentation for details.

Solution

Although I prefer using importlib.metadata, since there is another answer already showing how to do that, I will show you another alternative.

For the purpose of illustration, I will use one of my own packages genespeak from PyPI.

With metadata

try:
    from importlib import metadata
except ImportError:  # for Python<3.8
    import importlib_metadata as metadata

print(metadata.name('genespeak')) # genespeak
print(metadata.version('genespeak')) # 0.0.7

Use pkginfo PyPI

We will use the following 5 ways of accessing package information.

from pkginfo import SDist, BDist, Wheel, Installed, Develop

A. Check Package Info from Source Distributions

Typically you would create the source distribution file with:

python setup.py sdist

Assuming you have a .tar.gz file at path: ./dist/genespeak-0.0.7.tar.gz, here is what you need to extract the package info.

from pkginfo import SDist

pkg = SDist("./dist/genespeak-0.0.7.tar.gz")
# Now you can access the metadata fields from 
# PKG-INFO file inside the source file:
# `./dist/genespeak-0.0.7.tar.gz`
print(pkg.name) # genespeak
print(pkg.version) # 0.0.7

B. Check Package Info from Binary Distributions

Typically you would create the binary distribution files (.egg) with:

python setup.py bdist_egg

Assuming you have a .egg file at path: ./dist/genespeak-0.0.7-py38.egg, here is what you need to extract the package info.

from pkginfo import BDist

pkg = BDist("./dist/genespeak-0.0.7-py38.egg")
# Now you can access the metadata fields from 
# the binary distribution file (*.egg):
# `./dist/genespeak-0.0.7-py38.egg`
print(pkg.name) # genespeak
print(pkg.version) # 0.0.7

C. Check Package Info from Wheel

Typically you would create the binary distribution wheel files (.whl) with:

python setup.py bdist_wheel

Assuming you have a .whl file at path: ./dist/genespeak-0.0.7-py3-none-any-whl, here is what you need to extract the package info.

from pkginfo import Wheel

pkg = Wheel("./dist/genespeak-0.0.7-py3-none-any-whl")
# Now you can access the metadata fields from 
# PKG-INFO file inside the source file:
# `./dist/genespeak-0.0.7-py3-none-any.whl`
print(pkg.name) # genespeak
print(pkg.version) # 0.0.7

D. Check Package Info from Installed Packages

See here for more details

from pkginfo import Installed
import genespeak

pkg = Installed(genespeak)
# Now you can access the metadata fields from 
# PKG-INFO file inside the source file:
# `./dist/genespeak-0.0.7.tar.gz`
print(pkg.name) # genespeak
print(pkg.version) # 0.0.7

E. Check Package Info from Development Directory

from pkginfo import Develop

dev = Develop(".")
# Now you can access the metadata fields from 
# PKG-INFO file under `genespeak.egg-info` 
# directory under the project root.
print(dev.name) # genespeak
print(dev.version) # 0.0.7

References

Related