One extra requirement of dealing with dependencies is the ability to specify if it is required depending on the operating system or Python version in use. The specification of dependency specifiers defines the scheme which has been implemented by this module.


>>> from packaging.markers import Marker, UndefinedEnvironmentName
>>> marker = Marker("python_version>'2'")
>>> marker
<Marker('python_version > "2"')>
>>> # We can evaluate the marker to see if it is satisfied
>>> marker.evaluate()
>>> # We can also override the environment
>>> env = {'python_version': '1.5.4'}
>>> marker.evaluate(environment=env)
>>> # Multiple markers can be ANDed
>>> and_marker = Marker("os_name=='a' and os_name=='b'")
>>> and_marker
<Marker('os_name == "a" and os_name == "b"')>
>>> # Multiple markers can be ORed
>>> or_marker = Marker("os_name=='a' or os_name=='b'")
>>> or_marker
<Marker('os_name == "a" or os_name == "b"')>
>>> # Markers can be also used with extras, to pull in dependencies if
>>> # a certain extra is being installed
>>> extra = Marker('extra == "bar"')
>>> # You can do simple comparisons between marker objects:
>>> Marker("python_version > '3.6'") == Marker("python_version > '3.6'")
>>> # You can also perform simple comparisons between sets of markers:
>>> markers1 = {Marker("python_version > '3.6'"), Marker('os_name == "unix"')}
>>> markers2 = {Marker('os_name == "unix"'), Marker("python_version > '3.6'")}
>>> markers1 == markers2


class packaging.markers.Marker(markers)#

This class abstracts handling markers for dependencies of a project. It can be passed a single marker or multiple markers that are ANDed or ORed together. Each marker will be parsed according to the specification.


markers (str) – The string representation of a marker or markers.


InvalidMarker – If the given markers are not parseable, then this exception will be raised.


Evaluate the marker given the context of the current Python process.


environment (dict) – A dictionary containing keys and values to override the detected environment.


UndefinedComparison: If the marker uses a comparison on strings which are not valid versions per the specification of version specifiers.


UndefinedEnvironmentName: If the marker accesses a value that isn’t present inside of the environment dictionary.

Return type:


typeddict packaging.markers.Environment#


A dictionary that represents a Python environment as captured by default_environment().

Required Keys:
  • implementation_name (str) – The implementation’s identifier, e.g. 'cpython'.

  • implementation_version (str) – The implementation’s version, e.g. '3.13.0a2' for CPython 3.13.0a2, or '7.3.13' for PyPy3.10 v7.3.13.

  • os_name (str) – The value of The name of the operating system dependent module imported, e.g. 'posix'.

  • platform_machine (str) – Returns the machine type, e.g. 'i386'. An empty string if the value cannot be determined.

  • platform_release (str) – The system’s release, e.g. '2.2.0' or 'NT'. An empty string if the value cannot be determined.

  • platform_system (str) – The system/OS name, e.g. 'Linux', 'Windows' or 'Java'. An empty string if the value cannot be determined.

  • platform_version (str) – The system’s release version, e.g. '#3 on degas'. An empty string if the value cannot be determined.

  • python_full_version (str) – The Python version as string 'major.minor.patchlevel'. Note that unlike the Python sys.version, this value will always include the patchlevel (it defaults to 0).

  • platform_python_implementation (str) – A string identifying the Python implementation, e.g. 'CPython'.

  • python_version (str) – The Python version as string 'major.minor'.

  • sys_platform (str) – This string contains a platform identifier that can be used to append platform-specific components to sys.path, for instance. For Unix systems, except on Linux and AIX, this is the lowercased OS name as returned by uname -s with the first part of the version as returned by uname -r appended, e.g. 'sunos5' or 'freebsd8', at the time when Python was built.


Returns a dictionary representing the current Python process. This is the base environment that is used when evaluating markers in Marker.evaluate().

Return type:


exception packaging.markers.InvalidMarker#

Raised when attempting to create a Marker with a string that does not conform to the specification.

exception packaging.markers.UndefinedComparison#

Raised when attempting to evaluate a Marker with a comparison operator against values that are not valid versions per the specification of version specifiers.

exception packaging.markers.UndefinedEnvironmentName#

Raised when attempting to evaluate a Marker with a value that is missing from the evaluation environment.