verlib2
verlib2 is a Python library that provides a standalone bundle of version parsing implementations, specifically `distutils.version` (PEP 386) and `packaging.version` (PEP 440). Its primary purpose is to offer these functionalities without requiring the `packaging` library as a dependency, and to provide a solution for projects that relied on `distutils.version` after `distutils` was removed from the Python standard library in Python 3.12. It is actively maintained with a steady release cadence.
Common errors
-
ModuleNotFoundError: No module named 'distutils.version'
cause Attempting to import `distutils.version` in Python 3.12 or newer where `distutils` has been removed from the standard library.fixReplace `from distutils.version import ...` with `from verlib2.distutils.version import ...`. -
TypeError: '<' not supported between instances of 'Version' and 'str'
cause Attempting to compare a `verlib2.Version` object directly with a string. Version objects must be compared with other Version objects.fixEnsure all values being compared are instances of `verlib2.Version` (or `LooseVersion`/`StrictVersion`). For example, `Version('1.0') < Version('2.0')`.
Warnings
- breaking Direct imports from `distutils.version` will fail in Python 3.12 and later, as `distutils` was removed from the standard library.
- gotcha The default `verlib2.Version` class implements PEP 440, which has different parsing and comparison rules than PEP 386 (implemented by `LooseVersion` and `StrictVersion`). For instance, PEP 440 treats `1.0` and `1.0.0` as equal, while PEP 386's `LooseVersion` considers them different.
Install
-
pip install verlib2
Imports
- Version
from packaging.version import Version
from verlib2 import Version
- LooseVersion
from distutils.version import LooseVersion
from verlib2.distutils.version import LooseVersion
- StrictVersion
from distutils.version import StrictVersion
from verlib2.distutils.version import StrictVersion
Quickstart
from verlib2 import Version
from verlib2.distutils.version import LooseVersion, StrictVersion
# Using PEP 440 (packaging.version) style
v1 = Version("1.0.dev456")
v2 = Version("1!1.2.rev33+123456")
assert v1 < v2
assert Version("1.0") == Version("1.0.0")
# Using PEP 386 (distutils.version) style
lv1 = LooseVersion("1.2.3b1")
lv2 = LooseVersion("1.2.3")
assert lv1 < lv2
assert LooseVersion("1.0") != LooseVersion("1.0.0") # Different behavior than PEP 440
try:
sv = StrictVersion("1.2.3.4") # StrictVersion does not allow arbitrary suffixes
except ValueError as e:
print(f"StrictVersion error: {e}")