Skip to content Skip to sidebar Skip to footer

How To Access Python Package Metadata From Within The Python Console?

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=['

Solution 1:

With python3.8 being released, you might want to use the new importlib.metadata 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.


Solution 2:

One way to access the metadata is to use :

import pip

package = [pckg for pckg in pip.get_installed_distributions() 
            if pckg.project_name == 'package_name'][0]
#  packagevar will contain some metadata: version, project_name and others.

or pkg_resources

from pkg_resources import get_distribution

pkg = get_distribution('package_name')  # also contains a metadata

Solution 3:

The metadata are stored inside the <package>-<version>-<py version>.egg-info file.

when you create your module, you should have this line :

Writing /usr/lib/python2.7/site-packages/foobar-1.0-py2.7.egg-info

This file contain the Metadata :

Metadata-Version: 1.0Name: FoobarVersion: 1.0Summary: foobarHome-page: http://foobar.com/Author: foobarAuthor-email: foobar@foobar.netLicense: UNKNOWNDescription: UNKNOWNPlatform: UNKNOWN

If you want to access it, the best way is with pip or pkg_resources (as said Alexander Zhukov) ex :

>>>import pkg_resources>>>d = pkg_resources.get_distribution('Foobar')>>>d.version
'1.0'
>>>d.location
'/usr/lib/python2.7/site-packages'

Solution 4:

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 5:

Given setup.py as follows:

from distutils.core import setup

setup(
    name         = 'TestApp',
    version      = '0.0.1',
    author       = 'saaj',
    py_modules   = ['app'],
    test_suite   = 'test'
)

For some scripting and automation without installing the package, where pip, easy_install and even setuptools don't provide command line options or public APIs for reading all metadata (e.g. test_suite), here's a little hacky way:

python3 -c "import sys, types; m = types.ModuleType('distutils.core'); \
    m.setup = lambda **kwargs: print(kwargs); \
    sys.modules['distutils.core'] = m; import setup"

This will print a dict of keyword arguments passed to setup().

{'author': 'saaj', 'version': '0.0.1', 'name': 'TestApp', 
    'test_suite': 'test', 'py_modules': ['app']}

You can replace print in the lambda to whatever output you need. If your setup.py imports setup() from setuptools, which is actually the recommended way, just replace "distutils.core" with "setuptools" in the snippet.

Formatted snippet follows:

import sys
import types

m = types.ModuleType('distutils.core')
m.setup = lambda **kwargs: print(kwargs)
sys.modules['distutils.core'] = m

import setup  # import you setup.py with mocked setup()

Post a Comment for "How To Access Python Package Metadata From Within The Python Console?"