Recursively scans `python_modules` for providers registered with
    :py:mod:`wiring.scanning.register` module and for each one calls `callback`
    with :term:`specification` as the first argument, and the provider object
    as the second.

    Each element in `python_modules` may be a module reference or a string
    representing a path to a module.

    Module paths given in `ignore` are excluded from scanning.

def scan(python_modules, callback, ignore=tuple()):
    """
    Recursively scans `python_modules` for providers registered with
    :py:mod:`wiring.scanning.register` module and for each one calls `callback`
    with :term:`specification` as the first argument, and the provider object
    as the second.

    Each element in `python_modules` may be a module reference or a string
    representing a path to a module.

    Module paths given in `ignore` are excluded from scanning.
    """
    scanner = venusian.Scanner(callback=callback)
    for python_module in python_modules:
        if isinstance(python_module, six.string_types):
            python_module = importlib.import_module(python_module)
        scanner.scan(
            python_module,
            categories=[WIRING_VENUSIAN_CATEGORY],
            ignore=ignore
        )