from hotshot import Profile
from hotshot.stats import load as loadStats
from os import unlink


def runProfiler(func, args=tuple(), kw={}, verbose=True, nb_func=25,
                sort_by=('cumulative', 'calls')):
    profile_filename = "/tmp/profiler"
    prof = Profile(profile_filename)
    try:
        if verbose:
            print("[+] Run profiler")
        result = prof.runcall(func, *args, **kw)
        prof.close()
        if verbose:
            print("[+] Stop profiler")
            print("[+] Process data...")
        stat = loadStats(profile_filename)
        if verbose:
            print("[+] Strip...")
        stat.strip_dirs()
        if verbose:
            print("[+] Sort data...")
        stat.sort_stats(*sort_by)
        if verbose:
            print()
            print("[+] Display statistics")
            print()
        stat.print_stats(nb_func)
        return result
    finally:
        unlink(profile_filename)
