Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Checking a Python module version at runtime

People also ask

What is __ version __ in Python?

It provides a __version__ attribute. It provides the standard metadata version. Therefore it will be detected by pkg_resources or other tools that parse the package metadata (EGG-INFO and/or PKG-INFO, PEP 0345).

How do I check the version of a package?

To check the installed version of a particular package, you can use the npm list command by specifying a package name. If you want to check the latest version of a package available in npm repository, you can use the npm view package-name version command.


Use pkg_resources. Anything installed from PyPI at least should have a version number.

>>> import pkg_resources
>>> pkg_resources.get_distribution("blogofile").version
'0.7.1'

If you're on python >=3.8 you can use a module from the built-in library for that. To check a package's version (in this example lxml) run:

>>> from importlib.metadata import version
>>> version('lxml')
'4.3.1'

This functionality has been ported to older versions of python (<3.8) as well, but you need to install a separate library first:

pip install importlib_metadata

and then to check a package's version (in this example lxml) run:

>>> from importlib_metadata import version
>>> version('lxml')
'4.3.1'

Keep in mind that this works only for packages installed from PyPI. Also, you must pass a package name as an argument to the version method, rather than a module name that this package provides (although they're usually the same).


I'd stay away from hashing. The version of libxslt being used might contain some type of patch that doesn't effect your use of it.

As an alternative, I'd like to suggest that you don't check at run time (don't know if that's a hard requirement or not). For the python stuff I write that has external dependencies (3rd party libraries), I write a script that users can run to check their python install to see if the appropriate versions of modules are installed.

For the modules that don't have a defined 'version' attribute, you can inspect the interfaces it contains (classes and methods) and see if they match the interface they expect. Then in the actual code that you're working on, assume that the 3rd party modules have the interface you expect.


Some ideas:

  1. Try checking for functions that exist or don't exist in your needed versions.
  2. If there are no function differences, inspect function arguments and signatures.
  3. If you can't figure it out from function signatures, set up some stub calls at import time and check their behavior.

You can use

pip freeze

to see the installed packages in requirements format.