How To Access Python Package Metadata From Within The Python Console?
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 pip:
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?"