Read a config file: execute a python file while loading scapy, that may contain  # noqa: E501
    some pre-configured values.

    If _globals or _locals are specified, they will be updated with the loaded vars.  # noqa: E501
    This allows an external program to use the function. Otherwise, vars are only available  # noqa: E501
    from inside the scapy console.

    params:
    - _globals: the globals() vars
    - _locals: the locals() vars
    - interactive: specified whether or not errors should be printed using the scapy console or  # noqa: E501
    raised.

    ex, content of a config.py file:
        'conf.verb = 42\n'
    Manual loading:
        >>> _read_config_file("./config.py"))
        >>> conf.verb
        42

def _read_config_file(cf, _globals=globals(), _locals=locals(), interactive=True):  # noqa: E501
    """Read a config file: execute a python file while loading scapy, that may contain  # noqa: E501
    some pre-configured values.

    If _globals or _locals are specified, they will be updated with the loaded vars.  # noqa: E501
    This allows an external program to use the function. Otherwise, vars are only available  # noqa: E501
    from inside the scapy console.

    params:
    - _globals: the globals() vars
    - _locals: the locals() vars
    - interactive: specified whether or not errors should be printed using the scapy console or  # noqa: E501
    raised.

    ex, content of a config.py file:
        'conf.verb = 42\n'
    Manual loading:
        >>> _read_config_file("./config.py"))
        >>> conf.verb
        42
    """
    log_loading.debug("Loading config file [%s]", cf)
    try:
        exec(compile(open(cf).read(), cf, 'exec'), _globals, _locals)
    except IOError as e:
        if interactive:
            raise
        log_loading.warning("Cannot read config file [%s] [%s]", cf, e)
    except Exception:
        if interactive:
            raise
        log_loading.exception("Error during evaluation of config file [%s]", cf)