Skip to main content

Hunter is a flexible code tracing toolkit, not for measuring coverage, but for debugging, logging, inspection and other nefarious purposes. It has a simple Python API, a convenient terminal API and a CLI tool to attach to processes.

  • Free software: BSD 2-Clause License

Installation

pip install hunter

Documentation

https://python-hunter.readthedocs.io/

Getting started

Basic use involves passing various filters to the trace option. An example:

import hunter
hunter.trace(module='posixpath', action=hunter.CallPrinter)

import os
os.path.join('a', 'b')

That would result in:

>>> os.path.join('a', 'b')
         /usr/lib/python3.6/posixpath.py:75    call      => join(a='a')
         /usr/lib/python3.6/posixpath.py:80    line         a = os.fspath(a)
         /usr/lib/python3.6/posixpath.py:81    line         sep = _get_sep(a)
         /usr/lib/python3.6/posixpath.py:41    call         => _get_sep(path='a')
         /usr/lib/python3.6/posixpath.py:42    line            if isinstance(path, bytes):
         /usr/lib/python3.6/posixpath.py:45    line            return '/'
         /usr/lib/python3.6/posixpath.py:45    return       <= _get_sep: '/'
         /usr/lib/python3.6/posixpath.py:82    line         path = a
         /usr/lib/python3.6/posixpath.py:83    line         try:
         /usr/lib/python3.6/posixpath.py:84    line         if not p:
         /usr/lib/python3.6/posixpath.py:86    line         for b in map(os.fspath, p):
         /usr/lib/python3.6/posixpath.py:87    line         if b.startswith(sep):
         /usr/lib/python3.6/posixpath.py:89    line         elif not path or path.endswith(sep):
         /usr/lib/python3.6/posixpath.py:92    line         path += sep + b
         /usr/lib/python3.6/posixpath.py:86    line         for b in map(os.fspath, p):
         /usr/lib/python3.6/posixpath.py:96    line         return path
         /usr/lib/python3.6/posixpath.py:96    return    <= join: 'a/b'
'a/b'

In a terminal it would look like:

https://raw.githubusercontent.com/ionelmc/python-hunter/master/docs/code-trace.png

Another useful scenario is to ignore all standard modules and force colors to make them stay even if the output is redirected to a file.

import hunter
hunter.trace(stdlib=False, action=hunter.CallPrinter(force_colors=True))

Actions

Output format can be controlled with “actions”. There’s an alternative CodePrinter action that doesn’t handle nesting (it was the default action until Hunter 2.0).

If filters match then action will be run. Example:

import hunter
hunter.trace(module='posixpath', action=hunter.CodePrinter)

import os
os.path.join('a', 'b')

That would result in:

>>> os.path.join('a', 'b')
         /usr/lib/python3.6/posixpath.py:75    call      def join(a, *p):
         /usr/lib/python3.6/posixpath.py:80    line          a = os.fspath(a)
         /usr/lib/python3.6/posixpath.py:81    line          sep = _get_sep(a)
         /usr/lib/python3.6/posixpath.py:41    call      def _get_sep(path):
         /usr/lib/python3.6/posixpath.py:42    line          if isinstance(path, bytes):
         /usr/lib/python3.6/posixpath.py:45    line              return '/'
         /usr/lib/python3.6/posixpath.py:45    return            return '/'
                                               ...       return value: '/'
         /usr/lib/python3.6/posixpath.py:82    line          path = a
         /usr/lib/python3.6/posixpath.py:83    line          try:
         /usr/lib/python3.6/posixpath.py:84    line              if not p:
         /usr/lib/python3.6/posixpath.py:86    line              for b in map(os.fspath, p):
         /usr/lib/python3.6/posixpath.py:87    line                  if b.startswith(sep):
         /usr/lib/python3.6/posixpath.py:89    line                  elif not path or path.endswith(sep):
         /usr/lib/python3.6/posixpath.py:92    line                      path += sep + b
         /usr/lib/python3.6/posixpath.py:86    line              for b in map(os.fspath, p):
         /usr/lib/python3.6/posixpath.py:96    line          return path
         /usr/lib/python3.6/posixpath.py:96    return        return path
                                               ...       return value: 'a/b'
'a/b'
  • or in a terminal:

https://raw.githubusercontent.com/ionelmc/python-hunter/master/docs/simple-trace.png

Another useful action is the VarsPrinter:

import hunter
# note that this kind of invocation will also use the default `CallPrinter` action
hunter.trace(hunter.Q(module='posixpath', action=hunter.VarsPrinter('path')))

import os
os.path.join('a', 'b')

That would result in:

>>> os.path.join('a', 'b')
     /usr/lib/python3.6/posixpath.py:75    call      => join(a='a')
     /usr/lib/python3.6/posixpath.py:80    line         a = os.fspath(a)
     /usr/lib/python3.6/posixpath.py:81    line         sep = _get_sep(a)
     /usr/lib/python3.6/posixpath.py:41    call      [path => 'a']
     /usr/lib/python3.6/posixpath.py:41    call         => _get_sep(path='a')
     /usr/lib/python3.6/posixpath.py:42    line      [path => 'a']
     /usr/lib/python3.6/posixpath.py:42    line            if isinstance(path, bytes):
     /usr/lib/python3.6/posixpath.py:45    line      [path => 'a']
     /usr/lib/python3.6/posixpath.py:45    line            return '/'
     /usr/lib/python3.6/posixpath.py:45    return    [path => 'a']
     /usr/lib/python3.6/posixpath.py:45    return       <= _get_sep: '/'
     /usr/lib/python3.6/posixpath.py:82    line         path = a
     /usr/lib/python3.6/posixpath.py:83    line      [path => 'a']
     /usr/lib/python3.6/posixpath.py:83    line         try:
     /usr/lib/python3.6/posixpath.py:84    line      [path => 'a']
     /usr/lib/python3.6/posixpath.py:84    line         if not p:
     /usr/lib/python3.6/posixpath.py:86    line      [path => 'a']
     /usr/lib/python3.6/posixpath.py:86    line         for b in map(os.fspath, p):
     /usr/lib/python3.6/posixpath.py:87    line      [path => 'a']
     /usr/lib/python3.6/posixpath.py:87    line         if b.startswith(sep):
     /usr/lib/python3.6/posixpath.py:89    line      [path => 'a']
     /usr/lib/python3.6/posixpath.py:89    line         elif not path or path.endswith(sep):
     /usr/lib/python3.6/posixpath.py:92    line      [path => 'a']
     /usr/lib/python3.6/posixpath.py:92    line         path += sep + b
     /usr/lib/python3.6/posixpath.py:86    line      [path => 'a/b']
     /usr/lib/python3.6/posixpath.py:86    line         for b in map(os.fspath, p):
     /usr/lib/python3.6/posixpath.py:96    line      [path => 'a/b']
     /usr/lib/python3.6/posixpath.py:96    line         return path
     /usr/lib/python3.6/posixpath.py:96    return    [path => 'a/b']
     /usr/lib/python3.6/posixpath.py:96    return    <= join: 'a/b'
'a/b'

In a terminal it would look like:

https://raw.githubusercontent.com/ionelmc/python-hunter/master/docs/vars-trace.png

You can give it a tree-like configuration where you can optionally configure specific actions for parts of the tree (like dumping variables or a pdb set_trace):

from hunter import trace, Q, Debugger
from pdb import Pdb

trace(
    # drop into a Pdb session if ``foo.bar()`` is called
    Q(module="foo", function="bar", kind="call", action=Debugger(klass=Pdb))
    |  # or
    Q(
        # show code that contains "mumbo.jumbo" on the current line
        lambda event: event.locals.get("mumbo") == "jumbo",
        # and it's not in Python's stdlib
        stdlib=False,
        # and it contains "mumbo" on the current line
        source__contains="mumbo"
    )
)

import foo
foo.func()

With a foo.py like this:

def bar():
    execution_will_get_stopped  # cause we get a Pdb session here

def func():
    mumbo = 1
    mumbo = "jumbo"
    print("not shown in trace")
    print(mumbo)
    mumbo = 2
    print(mumbo) # not shown in trace
    bar()

We get:

>>> foo.func()
not shown in trace
    /home/ionel/osp/python-hunter/foo.py:8     line          print(mumbo)
jumbo
    /home/ionel/osp/python-hunter/foo.py:9     line          mumbo = 2
2
    /home/ionel/osp/python-hunter/foo.py:1     call      def bar():
> /home/ionel/osp/python-hunter/foo.py(2)bar()
-> execution_will_get_stopped  # cause we get a Pdb session here
(Pdb)

In a terminal it would look like:

https://raw.githubusercontent.com/ionelmc/python-hunter/master/docs/tree-trace.png

Tracing processes

In similar fashion to strace Hunter can trace other processes, eg:

hunter-trace --gdb -p 123

If you wanna play it safe (no messy GDB) then add this in your code:

from hunter import remote
remote.install()

Then you can do:

hunter-trace -p 123

See docs on the remote feature.

Note: Windows ain’t supported.

Environment variable activation

For your convenience environment variable activation is available. Just run your app like this:

PYTHONHUNTER="module='os.path'" python yourapp.py

On Windows you’d do something like:

set PYTHONHUNTER=module='os.path'
python yourapp.py

The activation works with a clever .pth file that checks for that env var presence and before your app runs does something like this:

from hunter import *
trace(<whatever-you-had-in-the-PYTHONHUNTER-env-var>)

Note that Hunter is activated even if the env var is empty, eg: PYTHONHUNTER="".

Environment variable configuration

Sometimes you always use the same options (like stdlib=False or force_colors=True). To save typing you can set something like this in your environment:

PYTHONHUNTERCONFIG="stdlib=False,force_colors=True"

This is the same as PYTHONHUNTER="stdlib=False,action=CallPrinter(force_colors=True)".

Notes:

  • Setting PYTHONHUNTERCONFIG alone doesn’t activate hunter.

  • All the options for the builtin actions are supported.

  • Although using predicates is supported it can be problematic. Example of setup that won’t trace anything:

    PYTHONHUNTERCONFIG="Q(module_startswith='django')"
    PYTHONHUNTER="Q(module_startswith='celery')"

    which is the equivalent of:

    PYTHONHUNTER="Q(module_startswith='django'),Q(module_startswith='celery')"

    which is the equivalent of:

    PYTHONHUNTER="Q(module_startswith='django')&Q(module_startswith='celery')"

Filtering DSL

Hunter supports a flexible query DSL, see the introduction.

Development

To run the all tests run:

tox

Design notes

Hunter doesn’t do everything. As a design goal of this library some things are made intentionally austere and verbose (to avoid complexity, confusion and inconsistency). This has few consequences:

  • There are Operators but there’s no negation operator. Instead you’re expected to negate a Query object, eg: ~Q(module='re').

  • There are no specialized operators or filters - all filters behave exactly the same. For example:

    • No filter for packages. You’re expected to filter by module with an operator.

    • No filter for arguments, return values or variables. You’re expected to write your own filter function and deal with the problems of poking into objects.

  • Layering is minimal. There’s are some helpers that do some argument processing and conversions to save you some typing but that’s about it.

  • The library doesn’t try to hide the mechanics of tracing in Python - it’s 1:1 regarding what Python sends to a trace function if you’d be using sys.settrace.

  • Doesn’t have any storage. You are expected to redirect output to a file.

You should look at it like it’s a tool to help you understand and debug big applications, or a framework ridding you of the boring parts of settrace, not something that helps you learn Python.

FAQ

Why not Smiley?

There’s some obvious overlap with smiley but there are few fundamental differences:

  • Complexity. Smiley is simply over-engineered:

    • It uses IPC and a SQL database.

    • It has a webserver. Lots of dependencies.

    • It uses threads. Side-effects and subtle bugs are introduced in your code.

    • It records everything. Tries to dump any variable. Often fails and stops working.

    Why do you need all that just to debug some stuff in a terminal? Simply put, it’s a nice idea but the design choices work against you when you’re already neck-deep into debugging your own code. In my experience Smiley has been very buggy and unreliable. Your mileage may vary of course.

  • Tracing long running code. This will make Smiley record lots of data, making it unusable.

    Now because Smiley records everything, you’d think it’s better suited for short programs. But alas, if your program runs quickly then it’s pointless to record the execution. You can just run it again.

    It seems there’s only one situation where it’s reasonable to use Smiley: tracing io-bound apps remotely. Those apps don’t execute lots of code, they just wait on network so Smiley’s storage won’t blow out of proportion and tracing overhead might be acceptable.

  • Use-cases. It seems to me Smiley’s purpose is not really debugging code, but more of a “non interactive monitoring” tool.

In contrast, Hunter is very simple:

  • Few dependencies.

  • Low overhead (tracing/filtering code has an optional Cython extension).

  • No storage. This simplifies lots of things.

    The only cost is that you might need to run the code multiple times to get the filtering/actions right. This means Hunter is not really suited for “post-mortem” debugging. If you can’t reproduce the problem anymore then Hunter won’t be of much help.

Why not pytrace?

Pytrace is another tracer tool. It seems quite similar to Smiley - it uses a sqlite database for the events, threads and IPC, thus it’s reasonable to expect the same kind of problems.

Why not PySnooper or snoop?

snoop is a refined version of PySnooper. Both are more suited to tracing small programs or functions as the output is more verbose and less suited to the needs of tracing a big application where Hunter provides more flexible setup, filtering capabilities, speed and brevity.

Why not coverage?

For purposes of debugging coverage is a great tool but only as far as “debugging by looking at what code is (not) run”. Checking branch coverage is good but it will only get you as far.

From the other perspective, you’d be wondering if you could use Hunter to measure coverage-like things. You could do it but for that purpose Hunter is very “rough”: it has no builtin storage. You’d have to implement your own storage. You can do it but it wouldn’t give you any advantage over making your own tracer if you don’t need to “pre-filter” whatever you’re recording.

In other words, filtering events is the main selling point of Hunter - it’s fast (cython implementation) and the query API is flexible enough.

Projects using Hunter

Noteworthy usages or Hunter (submit a PR with your project if you built a tool that relies on hunter):

More projects using it at https://github.com/ionelmc/python-hunter/network/dependents

Changelog

3.5.0 (2022-09-11)

  • Add support for generators and coroutines in the hunter.wrap decorator.

  • Dropped support for Python 3.6.

3.4.3 (2021-12-15)

  • Removed most of the Python 2 support code.

  • Fix some refactoring regression in setup.py and make the 3.4.x series installable only on Python 3.6 and later.

  • Yank 3.4.0, 3.4.1, 3.4.2 releases to avoid install problems on Python 2.7.

3.4.2 (2021-12-15)

  • Fixed CI to properly make win32 wheels.

3.4.1 (2021-12-14)

  • Add support for building a pp37.pp38 tagged wheel (basically an universal wheel installable just for those two PyPy versions).

3.4.0 (2021-12-14)

  • Switched CI to GitHub Actions, this has a couple consequences:

    • Support for Python 2.7 is dropped. You can still install it there but it’s not tested anymore and Python 2 specific handling will be removed at some point.

    • Linux wheels are now provided in 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).

3.3.8 (2021-06-23)

  • Fixed CI problem that publishes same type of wheels two times.

3.3.7 (2021-06-23)

  • Fixed a bug with how stdlib is detected on Windows (at least).

3.3.6 (2021-06-23)

  • Fixed regression from 3.3.4: stdlib filter was broken.

  • Improved the pth file (PYTHONHUNTER environment variable activation) to use a clean eval environment. No bogus variables like line (from the site.py machinery) will be available anymore.

  • Fixed a bug in VarsSnooper that would make it fail in rare situation where a double return event is emitted.

3.3.5 (2021-06-11)

  • Added support for Python 3.10.

  • Added support for time objects and the fold option in safe_repr.

  • 3.3.4 was skipped cause I messed up the CI.

3.3.3 (2021-05-04)

  • 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).

3.3.2 (2021-03-25)

  • Changed CI to build Python 3.9 wheels. Python 3.5 no longer tested and wheels no longer built to keep things simple.

  • Documentation improvements.

3.3.1 (2020-10-24)

  • Fixed CI/test issues that prevented all of 21 wheels being published.

3.3.0 (2020-10-23)

  • Fixed handling so that hunter.event.Event.module is always the "?" string instead of None. Previously it was None when tracing particularly broken code and broke various predicates.

  • Similarly hunter.event.Event.filename is now "?" if there’s no filename available.

  • Building on the previous changes the actions have simpler code for displaying missing module/filenames.

  • Changed hunter.actions.CallPrinter so that trace events for builtin functions are displayed differently. These events appear when using profile mode (eg: trace(profile=True)).

  • Fixed failure that could occur if hunter.event.Event.module is an unicode string. Now it’s always a regular string. Only applies to Python 2.

  • Fixed argument display when tracing functions with tuple arguments. Closes #88. Only applies to Python 2.

  • Improved error reporting when internal failures occur. Now some details about the triggering event are logged.

3.2.2 (2020-09-04)

  • 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,function='getattr').

3.2.1 (2020-08-18)

  • Added support for regex, date and datetime in safe_repr.

  • Fixed call argument display when positional and keyword arguments are used in hunter.actions.CallPrinter.

3.2.0 (2020-08-16)

  • Implemented the hunter.actions.StackPrinter action.

  • Implemented the hunter.predicates.Backlog predicate. Contributed by Dan Ailenei in #81.

  • Improved contributing section in docs a bit. Contributed by Tom Schraitle in #85.

  • Improved filtering performance by avoiding a lot of unnecessary PyObject_GetAttr calls in the Cython implementation of hunter.predicates.Backlog.

  • Implemented the hunter.actions.ErrorSnooper action.

  • Added support for profiling mode (eg: trace(profile=True)). This mode will use setprofile instead of settrace.

  • Added ARM64 wheels and CI.

  • Added hunter.event.Event.instruction and hunter.event.Event.builtin (usable in profile mode).

  • Added more cookbook entries.

3.1.3 (2020-02-02)

  • Improved again the stdlib check to handle certain paths better.

3.1.2 (2019-01-19)

  • Really fixed the <frozen importlib.something stdlib check.

3.1.1 (2019-01-19)

  • Marked all the <frozen importlib.something files as part of stdlib.

3.1.0 (2019-01-19)

  • Added hunter.actions.ErrorSnooper - an action that detects silenced exceptions.

  • Added hunter.load_config and fixed issues with configuration being loaded too late from the PYTHONHUNTERCONFIG environment variable.

  • Changed hunter.From helper to automatically move depth and calls filters to the predicate (so they filter after hunter.predicates.From activates).

  • Changed 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.

  • Fixed a bunch of inconsistencies and bugs when using & and | operators with predicates.

  • Fixed a bunch of broken fields on detached events <hunter.event.Event.detach> (hunter.event.Event.function_object and hunter.event.Event.arg).

  • Improved docstrings in various and added a configuration doc section.

  • Improved testing (more coverage).

3.0.5 (2019-12-06)

  • 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 descriptors in special attributes/methods).

3.0.4 (2019-10-26)

  • Really fixed stream setup in actions (using force_colors without any stream was broken). See: hunter.actions.ColorStreamAction.

  • Fixed __repr__ for the hunter.predicates.From predicate to include watermark.

  • Added binary wheels for Python 3.8.

3.0.3 (2019-10-13)

  • Fixed safe_repr on pypy so it’s safer on method objects. See: hunter.actions.ColorStreamAction.

3.0.2 (2019-10-10)

  • Fixed setting stream from PYTHONHUNTERCONFIG environment variable. See: hunter.actions.ColorStreamAction.

  • Fixed a couple minor documentation issues.

3.0.1 (2019-06-17)

  • Fixed issue with coloring missing source message (coloring leaked into next line).

3.0.0 (2019-06-17)

  • 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 hunter.actions.ColorStreamAction.filename_prefix, hunter.actions.ColorStreamAction.output, hunter.actions.ColorStreamAction.pid_prefix, hunter.actions.ColorStreamAction.thread_prefix, hunter.actions.ColorStreamAction.try_repr and hunter.actions.ColorStreamAction.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.

2.2.1 (2019-01-19)

  • Fixed a link in changelog.

  • Fixed some issues in the Travis configuration.

2.2.0 (2019-01-19)

  • Added hunter.predicates.From predicate for tracing from a specific point. It stop after returning back to the same call depth with a configurable offset.

  • Fixed PYTHONHUNTERCONFIG not working in some situations (config values were resolved at the wrong time).

  • Made tests in CI test the wheel that will eventually be published to PyPI (tox-wheel).

  • Made event.stdlib more reliable: pkg_resources is considered part of stdlib and few more paths will be considered as stdlib.

  • Dumbed down the 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.

  • Added OSX in the Travis test grid.

2.1.0 (2018-11-17)

  • Made threading_support on by default but output automatic (also, now 1 or 0 allowed).

  • Added pid_alignment and force_pid action options to show a pid prefix.

  • Fixed some bugs around __eq__ in various classes.

  • Dropped Python 3.3 support.

  • Dropped dependency on fields.

  • Actions now repr using a simplified implementation that tries to avoid calling __repr__ on user classes in order to avoid creating side-effects while tracing.

  • Added support for the PYTHONHUNTERCONFIG environment variable (stores defaults and doesn’t activate hunter).

2.0.2 (2017-11-24)

  • Fixed indentation in hunter.actions.CallPrinter action (shouldn’t deindent on exception).

  • Fixed option filtering in Cython Query implementation (filtering on tracer was allowed by mistake).

  • Various fixes to docstrings and docs.

2.0.1 (2017-09-09)

  • Now Py_AddPendingCall is used instead of acquiring the GIL (when using GDB).

2.0.0 (2017-09-02)

  • Added the hunter.event.Event.count and hunter.event.Event.calls attributes.

  • Added the lt/lte/gt/gte lookups.

  • Added convenience aliases for startswith (sw), endswith (ew), contains (has) and regex (rx).

  • Added a convenience hunter.wrap decorator to start tracing around a function.

  • Added support for remote tracing (with two backends: manhole and GDB) via the hunter-trace bin. Note: Windows is NOT SUPPORTED.

  • Changed the default action to hunter.actions.CallPrinter. You’ll need to use action=CodePrinter if you want the old output.

1.4.1 (2016-09-24)

  • Fix support for getting sources for Cython module (it was broken on Windows and Python3.5+).

1.4.0 (2016-09-24)

  • Added support for tracing Cython modules (#30). A # cython: linetrace=True stanza or equivalent is required in Cython modules for this to work.

1.3.0 (2016-04-14)

  • Added hunter.event.Event.thread.

  • Added hunter.event.Event.threadid and hunter.event.Event.threadname (available for filtering with hunter.Q).

  • Added hunter.event.Event.threading_support argument to hunter.trace. It makes new threads be traced and changes action output to include thread name.

  • Added support for using pdb++ in the hunter.actions.Debugger action.

  • Added support for using manhole via a new hunter.actions.Manhole action.

  • Made the hunter.event.Event.handler a public but readonly property.

1.2.2 (2016-01-28)

  • Fix broken import. Require fields>=4.0.

  • Simplify a string check in Cython code.

1.2.1 (2016-01-27)

  • Fix “KeyError: ‘normal’” bug in hunter.actions.CallPrinter. Create the NO_COLORS dict from the COLOR dicts. Some keys were missing.

1.2.0 (2016-01-24)

  • Fixed printouts of objects that return very large string in __repr__(). Trimmed to 512. Configurable in actions with the repr_limit option.

  • Improved validation of hunter.actions.VarsPrinter’s initializer.

  • Added a hunter.actions.CallPrinter action.

1.1.0 (2016-01-21)

  • Implemented a destructor (__dealloc__) for the Cython tracer.

  • Improved the restoring of the previous tracer in the Cython tracer (use PyEval_SetTrace) directly.

  • Removed tracer as an allowed filtering argument in hunter.Query.

  • Add basic validation (must be callable) for positional arguments and actions passed into hunter.Q. Closes #23.

  • Fixed stdlib checks (wasn’t very reliable). Closes #24.

1.0.2 (2016-01-05)

  • Fixed missing import in setup.py.

1.0.1 (2015-12-24)

  • Fix a compile issue with the MSVC compiler (seems it don’t like the inline option on the fast_When_call).

1.0.0 (2015-12-24)

  • 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 from ``re, re.foobar, srefoobar but not from repr.

  • 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.

0.6.0 (2015-10-10)

  • Added a clear_env_var option on the tracer (disables tracing in subprocess).

  • Added force_colors option on hunter.actions.VarsPrinter and hunter.actions.CodePrinter.

  • Allowed setting the stream to a file name (option on hunter.actions.VarsPrinter and hunter.actions.CodePrinter).

  • Bumped up the filename alignment to 40 cols.

  • If not merging then self is not kept as a previous tracer anymore. Closes #16.

  • Fixed handling in VarsPrinter: properly print eval errors and don’t try to show anything if there’s an AttributeError. Closes #18.

  • Added a stdlib boolean flag (for filtering purposes). Closes #15.

  • Fixed broken frames that have “None” for filename or module (so they can still be treated as strings).

  • Corrected output files in the 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).

0.5.1 (2015-04-15)

  • Fixed hunter.event.Event.globals to actually be the dict of global vars (it was just the locals).

0.5.0 (2015-04-06)

  • 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.

0.4.0 (2015-03-29)

  • Disabled colors for Jython. Contributed by Claudiu Popa in #12.

  • Test suite fixes for Windows. Contributed by Claudiu Popa in #11.

  • Added an introduction section in the docs.

  • Implemented a prettier fallback for when no sources are available for that frame.

  • Implemented fixups in cases where you use action classes as a predicates.

0.3.1 (2015-03-29)

  • Forgot to merge some commits …

0.3.0 (2015-03-29)

  • Added handling for internal repr failures.

  • Fixed issues with displaying code that has non-ascii characters.

  • Implemented better display for call frames so that when a function has decorators the function definition is shown (instead of just the first decorator). See: #8.

0.2.1 (2015-03-28)

  • Added missing color entry for exception events.

  • Added hunter.event.Event.line property. It returns the source code for the line being run.

0.2.0 (2015-03-27)

  • 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”).

0.1.0 (2015-03-22)

  • First release on PyPI.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

hunter-3.5.0.tar.gz (561.4 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

hunter-3.5.0-pp39-pypy39_pp73-any.whl (52.2 kB view details)

Uploaded PyPy

hunter-3.5.0-pp38-pypy38_pp73-any.whl (52.2 kB view details)

Uploaded PyPy

hunter-3.5.0-pp37-pypy37_pp73-any.whl (52.2 kB view details)

Uploaded PyPy

hunter-3.5.0-cp310-cp310-win_amd64.whl (247.2 kB view details)

Uploaded CPython 3.10Windows x86-64

hunter-3.5.0-cp310-cp310-win32.whl (214.4 kB view details)

Uploaded CPython 3.10Windows x86

hunter-3.5.0-cp310-cp310-musllinux_1_1_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.10musllinux: musl 1.1+ x86-64

hunter-3.5.0-cp310-cp310-musllinux_1_1_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.10musllinux: musl 1.1+ ARM64

hunter-3.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

hunter-3.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

hunter-3.5.0-cp310-cp310-macosx_10_9_x86_64.whl (301.9 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

hunter-3.5.0-cp39-cp39-win_amd64.whl (251.2 kB view details)

Uploaded CPython 3.9Windows x86-64

hunter-3.5.0-cp39-cp39-win32.whl (217.3 kB view details)

Uploaded CPython 3.9Windows x86

hunter-3.5.0-cp39-cp39-musllinux_1_1_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.9musllinux: musl 1.1+ x86-64

hunter-3.5.0-cp39-cp39-musllinux_1_1_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.9musllinux: musl 1.1+ ARM64

hunter-3.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

hunter-3.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ ARM64

hunter-3.5.0-cp39-cp39-macosx_10_9_x86_64.whl (300.8 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

hunter-3.5.0-cp38-cp38-win_amd64.whl (251.2 kB view details)

Uploaded CPython 3.8Windows x86-64

hunter-3.5.0-cp38-cp38-win32.whl (217.1 kB view details)

Uploaded CPython 3.8Windows x86

hunter-3.5.0-cp38-cp38-musllinux_1_1_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.8musllinux: musl 1.1+ x86-64

hunter-3.5.0-cp38-cp38-musllinux_1_1_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.8musllinux: musl 1.1+ ARM64

hunter-3.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

hunter-3.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ ARM64

hunter-3.5.0-cp38-cp38-macosx_10_9_x86_64.whl (295.3 kB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

hunter-3.5.0-cp37-cp37m-win_amd64.whl (245.7 kB view details)

Uploaded CPython 3.7mWindows x86-64

hunter-3.5.0-cp37-cp37m-win32.whl (214.1 kB view details)

Uploaded CPython 3.7mWindows x86

hunter-3.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.7mmusllinux: musl 1.1+ x86-64

hunter-3.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.7mmusllinux: musl 1.1+ ARM64

hunter-3.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ x86-64

hunter-3.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ ARM64

hunter-3.5.0-cp37-cp37m-macosx_10_9_x86_64.whl (288.9 kB view details)

Uploaded CPython 3.7mmacOS 10.9+ x86-64

File details

Details for the file hunter-3.5.0.tar.gz.

File metadata

  • Download URL: hunter-3.5.0.tar.gz
  • Upload date:
  • Size: 561.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.10.6

File hashes

Hashes for hunter-3.5.0.tar.gz
Algorithm Hash digest
SHA256 fa5340275f154b8df29a1ddb6fe0812aabdce4543c41b370ecd014b2cca63018
MD5 12a0dbe997752ca13b876330ad7964a0
BLAKE2b-256 e20ccec85319310c8573d593138d4cb082c5afb9202fd9d70d6092f06b4afd20

See more details on using hashes here.

File details

Details for the file hunter-3.5.0-pp39-pypy39_pp73-any.whl.

File metadata

File hashes

Hashes for hunter-3.5.0-pp39-pypy39_pp73-any.whl
Algorithm Hash digest
SHA256 4695f309bef75d09bfdeac9e2bea4960c77b588445f2cc0392716c80bf45aa06
MD5 a0285ae3e1e926c29e0e46f974c08769
BLAKE2b-256 3cfb296c77a26598279668507ec24b31490f62fef21d60010e64d88665f1806f

See more details on using hashes here.

File details

Details for the file hunter-3.5.0-pp38-pypy38_pp73-any.whl.

File metadata

File hashes

Hashes for hunter-3.5.0-pp38-pypy38_pp73-any.whl
Algorithm Hash digest
SHA256 332acda2587b104fc1db12836d73e42e7f31fbbd878e34109b128df00b68960e
MD5 733397738a3f39f90e24752f264b1b36
BLAKE2b-256 a9dbdc2050799f83a183887fcbb434ad06d0c74e3bc207f85293844f83f8fcf2

See more details on using hashes here.

File details

Details for the file hunter-3.5.0-pp37-pypy37_pp73-any.whl.

File metadata

File hashes

Hashes for hunter-3.5.0-pp37-pypy37_pp73-any.whl
Algorithm Hash digest
SHA256 00c931ab7a0836129ec10c02e23212575d5a5890176714e4837cf01854df8b88
MD5 767be3d9da75cca5af0c7e9ed242a6ce
BLAKE2b-256 706a7300ecd6fdc1b233dc82256a9f3745f180802026f20e61429d2b80ee7c44

See more details on using hashes here.

File details

Details for the file hunter-3.5.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: hunter-3.5.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 247.2 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.10.6

File hashes

Hashes for hunter-3.5.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 1a3afc2d9c589f3f03fd3e87a640a09ec2c1f921b072a3e0d6ca8bb38609b9ee
MD5 de28cc679cb9babaec4fff516825d4b3
BLAKE2b-256 914b38a7624891d746fed3437e82059a729d670a17c70842bd9bdd2aeb64b584

See more details on using hashes here.

File details

Details for the file hunter-3.5.0-cp310-cp310-win32.whl.

File metadata

  • Download URL: hunter-3.5.0-cp310-cp310-win32.whl
  • Upload date:
  • Size: 214.4 kB
  • Tags: CPython 3.10, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.10.6

File hashes

Hashes for hunter-3.5.0-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 dd6568f7604bb7f0d5c942da388088f2d97d6b9ea64d115b83e53b94e1f47a13
MD5 507bb06fbea7a78745051bf5ed31b89d
BLAKE2b-256 27d48576fb8d62a10c05d2044d0b4a54215229713c3e6c0eb7099fd824c76509

See more details on using hashes here.

File details

Details for the file hunter-3.5.0-cp310-cp310-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for hunter-3.5.0-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 d898bfbfdb432a8bab566b19e851a013432a4681262e547d0334afa46a89731b
MD5 4c03a329177a077affc951c787b11e3b
BLAKE2b-256 efb1e550dfb9c2fd087c83cc558fa589d586eba21114c6862cd1e58bae1e8714

See more details on using hashes here.

File details

Details for the file hunter-3.5.0-cp310-cp310-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for hunter-3.5.0-cp310-cp310-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 d8c96786b8a2c21c61c022166430cf1a9be89c5059f4d2767ed2f57529ae1615
MD5 ac2a63b0f68df8d398eb98ff6ec5fe98
BLAKE2b-256 ab58d70f235df4ed118126a3669a45b6e21ab653adac21d9ccb6eabeff945420

See more details on using hashes here.

File details

Details for the file hunter-3.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for hunter-3.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a50ac6ece135b7dec1eb341422ca82b16c20cb1f85df3b1af8c2e55100f8f508
MD5 d2f72f1a652842cdedc95ae119596a93
BLAKE2b-256 276cf287623be30ab6cc1c333228bb5986449cb24d0b6dbd3b6a8917fc660a71

See more details on using hashes here.

File details

Details for the file hunter-3.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for hunter-3.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ff368cf0ba537a9f0ff8096957e9e89aa682211d50a0356d1169d4990a05f61e
MD5 07af18a5a43bca458d2d3797e1ab2f0a
BLAKE2b-256 ad4b5dab5c805d0c70a2c6b5a0200e7008baa4b9182544843a4d8e8768345a2b

See more details on using hashes here.

File details

Details for the file hunter-3.5.0-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for hunter-3.5.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 0756ab8da812f2dc7e6945942d877f6daf7876902ed9aada484287a8f8200dde
MD5 79b4ae3b0d7cc5f2716a40ec41dd6a1e
BLAKE2b-256 91cfb9ec1dc650024fd865e339bdc852fbdcd6d524c3ed95873b50f6dddd9dc0

See more details on using hashes here.

File details

Details for the file hunter-3.5.0-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: hunter-3.5.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 251.2 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.10.6

File hashes

Hashes for hunter-3.5.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 48f764e692416a9743a3d2a0ddfe35c1f25d5014ebb7b3f841850021e288d1f1
MD5 ab9fc265cc294c00c243f7ec65ed905f
BLAKE2b-256 2a6af926ed80bb5616c6f3b9e1c1e968cac51d549174912c7fdc9a85a433847b

See more details on using hashes here.

File details

Details for the file hunter-3.5.0-cp39-cp39-win32.whl.

File metadata

  • Download URL: hunter-3.5.0-cp39-cp39-win32.whl
  • Upload date:
  • Size: 217.3 kB
  • Tags: CPython 3.9, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.10.6

File hashes

Hashes for hunter-3.5.0-cp39-cp39-win32.whl
Algorithm Hash digest
SHA256 091075aaadaaa28453ce6a8ff3d642e6745f784d2d76da932f7bcb094180a3c2
MD5 b0ade47eb8dd37753799039e465037c2
BLAKE2b-256 002355e9c0267c250a31c1983be07b1314152b6fdeb17cd1011cf10334d5ddd3

See more details on using hashes here.

File details

Details for the file hunter-3.5.0-cp39-cp39-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for hunter-3.5.0-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 a52876eb4caedf3c2178faf5eda3c7ab3f11b0e72215e17aebb924f9c42dd24b
MD5 131e879e0afedc00fe4996f3d24d484d
BLAKE2b-256 00ca519ed97b9a660052834ec8f7f2b08feaac62496071687e2d62eeb67b337b

See more details on using hashes here.

File details

Details for the file hunter-3.5.0-cp39-cp39-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for hunter-3.5.0-cp39-cp39-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 5dbc586ebf7ae61e246c4d9a615ed73dbdc33eed9582de9d821fca4d2fce34f2
MD5 b67c006e274c0709080af89e71d73520
BLAKE2b-256 f33b4ab8a4908eaf2c6cb29feb4ffd22b8e29b50830f19df5699271e69c50999

See more details on using hashes here.

File details

Details for the file hunter-3.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for hunter-3.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e9b222457859f1585c00868dd7fd71080f2ba01a78f5d783ceb17aadb9489f02
MD5 1a8ea4d1d122ab4552dabe3269d36e1d
BLAKE2b-256 5c7648c4ce805d6f7677cc8537298537e5d226471bf06c3374e177c5f13ee08a

See more details on using hashes here.

File details

Details for the file hunter-3.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for hunter-3.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 bcddba604827f36728e0d49c578802cf8f8e5d09bff0f3fd1597becd8845427b
MD5 a793088f330413c662dd2c3e542f099a
BLAKE2b-256 a368c57fbc688adcdb42bba8e51c91f5f27a85ed0311fa5846662cc262012dcb

See more details on using hashes here.

File details

Details for the file hunter-3.5.0-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for hunter-3.5.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 259e6a20421a7dd5630c01997476bb4a30a38d730eae010252e6e90b60cd5a61
MD5 c540f9f2b487d036a7121c2ced29313c
BLAKE2b-256 913af993cd9babce1eedd2d1eec5fbe21563af6f254d7ed828eff4e2098f0d15

See more details on using hashes here.

File details

Details for the file hunter-3.5.0-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: hunter-3.5.0-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 251.2 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.10.6

File hashes

Hashes for hunter-3.5.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 c917764242cd6b3ae330a1d18052e185f1c04b85e46ed7bb2240b232a594787e
MD5 7ffcf24317559e4a574da96c5cf7ef69
BLAKE2b-256 7962ce78c64ef66a33ee4689a4f9a700172e8ab0d06522436c30284deb9ec1e6

See more details on using hashes here.

File details

Details for the file hunter-3.5.0-cp38-cp38-win32.whl.

File metadata

  • Download URL: hunter-3.5.0-cp38-cp38-win32.whl
  • Upload date:
  • Size: 217.1 kB
  • Tags: CPython 3.8, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.10.6

File hashes

Hashes for hunter-3.5.0-cp38-cp38-win32.whl
Algorithm Hash digest
SHA256 646efb45a61834835231683971a6f8abc40f44d8fb4f9a3498243c0281716bb6
MD5 25407b4142bd895acca32b36a9255b3e
BLAKE2b-256 24b4cee46dd018c259ff36da09e87b6181fc54e2872881fcd63a92614a1d0e27

See more details on using hashes here.

File details

Details for the file hunter-3.5.0-cp38-cp38-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for hunter-3.5.0-cp38-cp38-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 ed6aafc249b1d163ca70bb87a2369eb2dfca8568fbc0c9a63d9b5db43d9b9dfc
MD5 7aa3f5511c8b74b48cfa32058fbea2c1
BLAKE2b-256 2b596421b5291a47d381075ec6ab6dea439577cd4d143b484d3f61bbd7309a1c

See more details on using hashes here.

File details

Details for the file hunter-3.5.0-cp38-cp38-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for hunter-3.5.0-cp38-cp38-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 6abba7f66df6829de80ed0431d4863697cb603ceac343d9949822c3bb1b5aee9
MD5 7d7bcde57dad9cdcef00ee20e1e0cf04
BLAKE2b-256 41851c57f563ff7821663e9e440e9dfcde3d90a44b05b313eefeecf8f46686e2

See more details on using hashes here.

File details

Details for the file hunter-3.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for hunter-3.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d2b66cadb9ec257271bcf15b72a97fb743743284a3fa08cb243d91020deff6d4
MD5 78a47b820565dd86c36f0bc943ee8d1c
BLAKE2b-256 5cf881a311141652f639b32c46ffe21fb178944aacd3a7509c944243e6e460b4

See more details on using hashes here.

File details

Details for the file hunter-3.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for hunter-3.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 582ad439eb1b8e82243b183b9a4f70e131bd5ea26af2d6e89c897f79cd47cead
MD5 a80a0e5afbaf60d45ce0807747055fd9
BLAKE2b-256 a145f0db9c51e4cb5ff765cb1c221e0ea6e0fa139ab294d5ada244f020f2c658

See more details on using hashes here.

File details

Details for the file hunter-3.5.0-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for hunter-3.5.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d543997640000b65ab7aa6b71d0fb8c760371360b895e5f9fec3eab2d529a18a
MD5 245045cd97a95ee121bab6a5ab78e419
BLAKE2b-256 0c38617011c3955d4fde6a961ab54e192aaa19239c429d687bd98fc650251195

See more details on using hashes here.

File details

Details for the file hunter-3.5.0-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: hunter-3.5.0-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 245.7 kB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.10.6

File hashes

Hashes for hunter-3.5.0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 b05430a750e37886cbf3f81433c528481c71e92c171d8e3f78210c96bf69e9df
MD5 d91afd9ca56959f913c56ba9821cf4f4
BLAKE2b-256 b776fb51d3fb7b8f6a14774a79efa352e5f355077c4d7e154c3a470ea8eb3f49

See more details on using hashes here.

File details

Details for the file hunter-3.5.0-cp37-cp37m-win32.whl.

File metadata

  • Download URL: hunter-3.5.0-cp37-cp37m-win32.whl
  • Upload date:
  • Size: 214.1 kB
  • Tags: CPython 3.7m, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.10.6

File hashes

Hashes for hunter-3.5.0-cp37-cp37m-win32.whl
Algorithm Hash digest
SHA256 773fb7eda26978467e95906c1135050475ee1b0039281202a972c496a0fc7572
MD5 340267075ce354a1b0304110f59c0bc3
BLAKE2b-256 10767e7978e5bba772f12e4300bcc46816528412eee4ff14515442faa0189680

See more details on using hashes here.

File details

Details for the file hunter-3.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for hunter-3.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 6932d0268b9577db1355b51073ed9275333524f4b58b8d89df247ca1f03c6371
MD5 ac42a03a421a7dd812887f4035682c45
BLAKE2b-256 9bdd352ba4e8d3013e76e0332002cda0132a2c752f3bc842be089d332e1308c1

See more details on using hashes here.

File details

Details for the file hunter-3.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for hunter-3.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 09926b7fb36579c951c7bf10f444bf2c26ce948597176d19a35800fee439cc66
MD5 88dd871684cc5d1ddc73a40c4903c861
BLAKE2b-256 529eda5b638c49753e63c1f244bff00b1617526c291a9a6298d9b78bcb83c270

See more details on using hashes here.

File details

Details for the file hunter-3.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for hunter-3.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1c3d16ee66bd892c1b6e7e674dd6cb158a8b60746129a7c27231272b752544cd
MD5 99e1f0fb466d47a10cfafda3cd5e1f27
BLAKE2b-256 6a843baf7999c90f92d54850f4751465f782591f0fa77f162d665a36050e9d91

See more details on using hashes here.

File details

Details for the file hunter-3.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for hunter-3.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 342ad2c6cce3abc2a15e6931eee356e275019f88271a471ac5785c44d80a306a
MD5 2ae390426bef7cc4ff92ce290cf1c0bc
BLAKE2b-256 2deccf79e717bb4c99b2644a40099af74546048129fb08797a430404b14cfc01

See more details on using hashes here.

File details

Details for the file hunter-3.5.0-cp37-cp37m-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for hunter-3.5.0-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 b48454e9fc981918e7b66e8bc479c4c71ac9686c2e4e5388bf0c0283c60fa135
MD5 58a934b23f686ef99f76a7dfc9342875
BLAKE2b-256 fad188e04bed9e54d8e21fa513c103a1e0e349d54193022535847d4a1c9d31ef

See more details on using hashes here.

Release history Release notifications | RSS feed

3.9.0

51 files

3.8.0

30 files

3.7.0

37 files

3.6.1

16 files

3.6.0

16 files

3.5.1

32 files

This release

3.5.0 This release

32 files

3.4.3

37 files

3.4.1

32 files

3.4.0

31 files

3.3.8

22 files

3.3.5

22 files

3.3.3

22 files

3.3.2

22 files

3.3.1

22 files

3.3.0

20 files

3.2.2

22 files

3.2.1

22 files

3.2.0

22 files

3.1.3

18 files

3.1.2

18 files

3.1.1

13 files

3.1.0

13 files

3.0.5

18 files

3.0.4

18 files

3.0.3

15 files

3.0.2

14 files

3.0.1

15 files

3.0.0

15 files

2.2.1

18 files

2.2.0.post1

1 file

2.2.0

18 files

2.1.0

22 files

2.0.2

23 files

2.0.1

23 files

2.0.0

23 files

1.4.1

14 files

1.4.0

8 files

1.3.0

14 files

1.2.2

7 files

1.2.1

7 files

1.2.0

7 files

1.1.0

7 files

1.0.2

7 files

1.0.1

7 files

1.0.0

1 file

0.6.0

2 files

0.5.1

2 files

0.5.0

2 files

0.4.0

2 files

0.3.1

2 files

0.3.0

2 files

0.2.1

2 files

0.2.0

2 files

0.1.0

2 files

0.0.1

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page