NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #4885 most downloaded on PyPI
Hunter is a flexible code tracing toolkit.
Last release 1 years ago
22 Aug 2025
Release timing varies
gaps range from 2 weeks to 1.2 years
Nearly every release is documented
notes for 52 of 54 stable releases
2 versions withdrawn
withdrawn after publishing
12 years old
56 releases · first in 2015
Added support and wheels for Python 3.14.
Added support and wheels for Python 3.14.
Modernized packaging to have metadata in pyproject.toml.
Added support for Python 3.13, including freethreading variant (but not really tested, as most of the test suite is singlethreaded).
Drop support for Python 3.8.
Added support for Python 3.13, including freethreading variant (but not really tested, as most of the test suite is singlethreaded).
Fixed issues with latest Cython release (3.1.2).
Simplified the Event.__init__ so doesn't require or accept a Tracer instance anymore to fill in some options.
Fixed hardcoded python executable in tests. Contributed by Steve Kowalik in #126 <https://github.com/ionelmc/python-hunter/pull/126>.
One column per quarter.
Upgrade linters and refactor various string formatting and other cleanups.
Drop support for Python 3.7.
Upgrade linters and refactor various string formatting and other cleanups.
Upgrade Cython to latest release (3.0.10).
Linux wheels should be back now.
Switched docs theme to furo.
Added safe repr support for Decimal objects.
Added safe repr support for Decimal objects.
Added C extension support for Python 3.11. This may come with up to 10% performance hit (depending on use-case) for all Pythons. Unfortunately some co
Added C extension support for Python 3.11. This may come with up to 10% performance hit (depending on use-case) for all Pythons. Unfortunately some compat shims are now used for getting frame details. This is necessary to be able to work with Python 3.11 and be more future-proof.
Added safe repr support for ZoneInfo objects.
C extension files are now prebuilt with Cython 3.0b2.
Replaced the flake8/isort pre-commit hooks with ruff.
Disabled editable wheels (PEP-0662) as they don't include the hunter.pth file. There may be a way to do it but I haven't figured out a way to customize the editable_wheel command without a very brittle solution glued to setuptools' internals.
Fixed breakage in hunter-trace when Ctrl-C.
Fixed breakage in hunter-trace when Ctrl-C.
Add support for generators and coroutines in the hunter.wrap decorator.
hunter.wrap decorator.Removed most of the Python 2 support code.
setup.py and make the 3.4.x series installable only on Python 3.6 and later.Add support for building a pp37.pp38 tagged wheel (basically an universal wheel installable just for those two PyPy versions).
pp37.pp38 tagged wheel
(basically an universal wheel installable just for those two PyPy versions).Switched CI to GitHub Actions, this has a couple consequences:
Switched CI to GitHub Actions, this has a couple consequences:
musllinux and manylinux2014 variants.Extension building is now completely skipped on PyPy.
A pure but tagged as platform specific wheel is now provided for PyPy (to have fast installs there as well).
Fixed CI problem that publishes same type of wheels two times.
Added support for time objects and the fold option in safe_repr.
time objects and the fold option in safe_repr.Fixed tracer still being active for other threads after it was stopped.
Fixed tracer still being active for other threads after it was stopped.
Python unfortunately only allows removing the trace function for the current thread - now hunter.tracer.Tracer will uninstall itself if it's marked as stopped.
This fixes bogus errors that appear when using ipdb with the hunter.actions.Debugger action while thread support is enabled (the default).
Changed CI to build Python 3.9 wheels. Python 3.5 no longer tested and wheels no longer built to keep things simple.
Fixed CI/test issues that prevented all of 21 wheels being published.
Fixed handling so that hunter.event.Event.module is always the "?" string instead of None. Previously it was None when tracing particularly broken cod
hunter.event.Event.module is always the "?" string instead of None. Previously it was None when tracing particularly broken code and broke various predicates.
hunter.event.Event.filename is now "?" if there's no filename available.hunter.actions.CallPrinter so that trace events for builtin functions are displayed differently. These events appear when using profile mode (eg: trace(profile=True)).hunter.event.Event.module is an unicode string. Now it's always a regular string. Only applies to Python 2.Fixed oversight over what value is in hunter.event.Event.builtin. Now it's always a boolean, and can be used consistently in filters (eg: builtin=True
hunter.event.Event.builtin. Now it's always a boolean, and can be used consistently in filters (eg: builtin=True,function='getattr').Added support for regex, date and datetime in safe_repr.
safe_repr.
hunter.actions.CallPrinter.Implemented the hunter.actions.StackPrinter action.
hunter.actions.StackPrinter action.
hunter.predicates.Backlog predicate. Contributed by Dan Ailenei in #81.PyObject_GetAttr calls in the Cython implementation of hunter.predicates.Backlog.hunter.actions.ErrorSnooper action.trace(profile=True)). This mode will use setprofile instead of settrace.hunter.event.Event.instruction and hunter.event.Event.builtin (usable in profile mode).Improved again the stdlib check to handle certain paths better.
Really fixed the <frozen importlib.something stdlib check.
<frozen importlib.something stdlib check.Marked all the <frozen importlib.something files as part of stdlib.
<frozen importlib.something files as part of stdlib.Added hunter.actions.ErrorSnooper - an action that detects silenced exceptions.
hunter.actions.ErrorSnooper - an action that detects silenced exceptions.
hunter.load_config and fixed issues with configuration being loaded too late from the PYTHONHUNTERCONFIG environment variable.hunter.From helper to automatically move depth and calls filters to the predicate (so they filter after hunter.predicates.From activates).hunter.predicates.From to pass a copy of event to the predicate. The copy will have the depth and calls attributes adjusted to the point where hunter.predicates.From activated.& and | operators with predicates.hunter.event.Event.detach (hunter.event.Event.function_object and hunter.event.Event.arg).Really fixed safe_repr so it doesn't cause side-effects (now isinstance/issubclass are avoided - they can cause side-effects in code that abuses descr
safe_repr so it doesn't cause side-effects (now isinstance/issubclass are avoided - they can cause side-effects in code that abuses descriptors in special attributes/methods).Really fixed stream setup in actions (using force_colors without any stream was broken). See: hunter.actions.ColorStreamAction.
stream setup in actions (using force_colors without any stream was broken). See: hunter.actions.ColorStreamAction.
__repr__ for the hunter.predicates.From predicate to include watermark.Fixed safe_repr on pypy so it's safer on method objects. See: hunter.actions.ColorStreamAction.
safe_repr on pypy so it's safer on method objects. See: hunter.actions.ColorStreamAction.Fixed setting stream from PYTHONHUNTERCONFIG environment variable. See: hunter.actions.ColorStreamAction.
stream from PYTHONHUNTERCONFIG environment variable. See: hunter.actions.ColorStreamAction.
Fixed issue with coloring missing source message (coloring leaked into next line).
Replaced unsafe_repr option with repr_func. Now you can use your custom repr function in the builtin actions. BACKWARDS INCOMPATIBLE
The package now uses setuptools-scm for development builds (available at https://test.pypi.org/project/hunter/). As a consequence installing the sdist will download setuptools-scm.
Recompiled cython modules with latest Cython. Hunter can be installed without any Cython, as before.
Refactored some of the cython modules to have more typing information and not use deprecated property syntax.
Replaced unsafe_repr option with repr_func. Now you can use your custom repr function in the builtin actions. BACKWARDS INCOMPATIBLE
Fixed buggy filename handling when using Hunter in ipython/jupyter. Source code should be properly displayed now.
Removed globals option from VarsPrinter action. Globals are now always looked up. BACKWARDS INCOMPATIBLE
Added support for locals in VarsPrinter action. Now you can do VarsPrinter('len(foobar)').
Always pass module_globals dict to linecache methods. Source code from PEP-302 loaders is now printed properly. Contributed by Mikhail Borisov in #65.
Various code cleanup, style and docstring fixing.
Added hunter.From helper to allow passing in filters directly as keyword arguments.
Added hunter.event.Event.detach for storing events without leaks or side-effects (due to prolonged references to Frame objects, local or global variables).
Refactored the internals of actions for easier subclassing.
Added the filename_prefix, output, pid_prefix, thread_prefix, try_repr and try_source methods to the hunter.actions.ColorStreamAction baseclass.
Added hunter.actions.VarsSnooper - a PySnooper-inspired variant of hunter.actions.VarsPrinter. It will record and show variable changes, with the risk of leaking or using too much memory of course :)
Fixed tracers to log error and automatically stop if there's an internal failure. Previously error may have been silently dropped in some situations.
Fixed some issues in the Travis configuration.
Nothing published for this version
Added hunter.predicates.From predicate for tracing from a specific point. It stop after returning back to the same call depth with a configurable offs
hunter.predicates.From predicate for tracing from a specific point. It stop after returning back to the same call depth with a configurable offset.
PYTHONHUNTERCONFIG not working in some situations (config values were resolved at the wrong time).event.stdlib more reliable: pkg_resources is considered part of stdlib and few more paths will be considered as stdlib.get_peercred check that is done when attaching with hunter-trace CLI (via hunter.remote.install()). It will be slightly insecure but will work on OSX.Made threading_support on by default but output automatic (also, now 1 or 0 allowed).
threading_support on by default but output automatic (also, now 1 or 0 allowed).
pid_alignment and force_pid action options to show a pid prefix.__eq__ in various classes.__repr__ on user classes in order to avoid creating side-effects while tracing.PYTHONHUNTERCONFIG environment variable (stores defaults and doesn't activate hunter).Fixed indentation in hunter.actions.CallPrinter action (shouldn't deindent on exception).
hunter.actions.CallPrinter action (shouldn't deindent on exception).
tracer was allowed by mistake).Now Py_AddPendingCall is used instead of acquiring the GIL (when using GDB).
Py_AddPendingCall is used instead of acquiring the GIL (when using GDB).Added the hunter.event.Event.count and hunter.event.Event.calls attributes.
hunter.event.Event.count and hunter.event.Event.calls attributes.
lt/lte/gt/gte lookups.startswith (sw), endswith (ew), contains (has) and regex (rx).hunter.wrap decorator to start tracing around a function.hunter-trace bin. Note: Windows is NOT SUPPORTED.hunter.actions.CallPrinter. You'll need to use action=CodePrinter if you want the old output.Fix support for getting sources for Cython module (it was broken on Windows and Python3.5+).
Added support for tracing Cython modules (\#30). A # cython: linetrace=True stanza or equivalent is required in Cython modules for this to work.
# cython: linetrace=True stanza or equivalent is required in Cython modules for this to work.Added hunter.event.Event.thread.
hunter.event.Event.thread.
hunter.event.Event.threadid and hunter.event.Event.threadname (available for filtering with hunter.Q).hunter.event.Event.threading_support argument to hunter.trace. It makes new threads be traced and changes action output to include thread name.hunter.actions.Debugger action.hunter.actions.Manhole action.hunter.event.Event.handler a public but readonly property.Fix broken import. Require fields>=4.0.
fields>=4.0.Fix "KeyError: 'normal'" bug in hunter.actions.CallPrinter. Create the NO\_COLORS dict from the COLOR dicts. Some keys were missing.
hunter.actions.CallPrinter. Create the NO_COLORS dict from the COLOR dicts. Some keys were missing.Fixed printouts of objects that return very large string in __repr__(). Trimmed to 512. Configurable in actions with the repr_limit option.
__repr__(). Trimmed to 512. Configurable in actions with the repr_limit option.
hunter.actions.VarsPrinter's initializer.hunter.actions.CallPrinter action.Implemented a destructor (__dealloc__) for the Cython tracer.
__dealloc__) for the Cython tracer.
PyEval_SetTrace) directly.tracer as an allowed filtering argument in hunter.Query.hunter.Q. Closes #23.stdlib checks (wasn't very reliable). Closes #24.Fixed missing import in setup.py.
setup.py.Fix a compile issue with the MSVC compiler (seems it don't like the inline option on the fast_When_call).
fast_When_call).Implemented fast tracer and query objects in Cython. MAY BE BACKWARDS INCOMPATIBLE
Implemented fast tracer and query objects in Cython. MAY BE BACKWARDS INCOMPATIBLE
To force using the old pure-python implementation set the PUREPYTHONHUNTER environment variable to non-empty value.
Added filtering operators: contains, startswith, endswith and in. Examples:
Q(module_startswith='foo' will match events from foo, foo.bar and foobar.Q(module_startswith=['foo', 'bar'] will match events from foo, foo.bar, foobar, bar, bar.foo and baroo .Q(module_endswith='bar' will match events from foo.bar and foobar.Q(module_contains='ip' will match events from lipsum.Q(module_in=['foo', 'bar'] will match events from foo and bar.Q(module_regex=r"(re|sre.*)\b") will match events fromre,re.foobar,srefoobarbut not fromrepr``.Removed the merge option. Now when you call hunter.trace(...) multiple times only the last one is active. BACKWARDS INCOMPATIBLE
Remove the previous_tracer handling. Now when you call hunter.trace(...) the previous tracer (whatever was in sys.gettrace()) is disabled and restored when hunter.stop() is called. BACKWARDS INCOMPATIBLE
Fixed CodePrinter to show module name if it fails to get any sources.
Added a clear_env_var option on the tracer (disables tracing in subprocess).
clear_env_var option on the tracer (disables tracing in subprocess).
force_colors option on hunter.actions.VarsPrinter and hunter.actions.CodePrinter.hunter.actions.VarsPrinter and hunter.actions.CodePrinter).self is not kept as a previous tracer anymore. Closes #16.stdlib boolean flag (for filtering purposes). Closes #15.install_lib command so that pip can uninstall the pth file. This only works when it's installed with pip (sadly, setup.py install/develop and pip install -e will still leave pth garbage on pip uninstall hunter).Fixed hunter.event.Event.globals to actually be the dict of global vars (it was just the locals).
hunter.event.Event.globals to actually be the dict of global vars (it was just the locals).Fixed And and Or "single argument unwrapping".
And and Or "single argument unwrapping".Or(Or(a, b), c) is converted to Or(a, b, c).Event.source to Event.fullsource.Event.source that doesn't do any fancy sourcecode tokenization.Event.fullsource return value for situations where the tokenizer would fail.__repr__ for Event.Fixed hunter.And and hunter.Or "single argument unwrapping".
Implemented predicate compression. Example: Or(Or(a, b), c) is converted to Or(a, b, c).
Renamed hunter.event.Event.source to hunter.event.Event.fullsource.
Added hunter.event.Event.source that doesn't do any fancy sourcecode tokenization.
Fixed hunter.event.Event.fullsource return value for situations where the tokenizer would fail.
Made the print function available in the PYTHONHUNTER env var payload.
Added a __repr__ for hunter.event.Event.
Disabled colors for Jython (contributed by Claudiu Popa in #12).
Forgot to merge some commits ...
Added handling for internal repr failures.
call frames so that when a function has decorators the
function definition is shown (instead of just the first decorator).
See: #8.Added missing color entry for exception events.
Event.line property. It returns the source code for the line being run.Added missing color entry for exception events.
Added hunter.event.Event.line property. It returns the source code for the line being run.
Added color support (and colorama as dependency).
## Changes - Added color support (and colorama as dependency). - Added support for expressions in VarsPrinter. - Breaking changes:
Renamed F to Q. And Q is now just a convenience wrapper for Query.
Renamed the PYTHON_HUNTER env variable to PYTHONHUNTER.
Changed When to take positional arguments.
Changed output to show 2 path components (still not configurable).
Changed VarsPrinter to take positional arguments for the names.
Improved error reporting for env variable activation (PYTHONHUNTER).
Fixed env var activator (the .pth file) installation with setup.py install (the "egg installs") and setup.py develop/pip install -e (the "egg links").
## Installation
` pip install hunter==0.2.0 `
Added color support (and colorama as dependency).
Added support for expressions in hunter.actions.VarsPrinter.
Breaking changes:
Renamed F to hunter.Q. And hunter.Q is now just a convenience wrapper for hunter.predicates.Query.
Renamed the PYTHON_HUNTER env variable to PYTHONHUNTER.
Changed hunter.predicates.When to take positional arguments.
Changed output to show 2 path components (still not configurable).
Changed hunter.actions.VarsPrinter to take positional arguments for the names.
Improved error reporting for env variable activation (PYTHONHUNTER).
Fixed env var activator (the .pth file) installation with setup.py install (the "egg installs") and setup.py develop/pip install -e (the "egg links").
* First release on PyPI.
First release on PyPI.
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →