Skip to main content

Hunter is a flexible code tracing toolkit.

Project description

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.7.0 (2024-05-02)

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

3.6.1 (2023-04-26)

  • Added safe repr support for Decimal objects.

3.6.0 (2023-04-25)

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

3.5.1 (2022-09-27)

  • Fixed breakage in hunter-trace when Ctrl-C.

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.

Project details


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.7.0.tar.gz (672.6 kB view details)

Uploaded Source

Built Distributions

hunter-3.7.0-pp310.pp38.pp39-none-any.whl (52.7 kB view details)

Uploaded PyPy

hunter-3.7.0-cp312-cp312-win_amd64.whl (279.4 kB view details)

Uploaded CPython 3.12 Windows x86-64

hunter-3.7.0-cp312-cp312-win32.whl (241.1 kB view details)

Uploaded CPython 3.12 Windows x86

hunter-3.7.0-cp312-cp312-musllinux_1_1_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.12 musllinux: musl 1.1+ x86-64

hunter-3.7.0-cp312-cp312-musllinux_1_1_aarch64.whl (1.8 MB view details)

Uploaded CPython 3.12 musllinux: musl 1.1+ ARM64

hunter-3.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

hunter-3.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.8 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARM64

hunter-3.7.0-cp312-cp312-macosx_11_0_arm64.whl (296.7 kB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

hunter-3.7.0-cp311-cp311-win_amd64.whl (282.4 kB view details)

Uploaded CPython 3.11 Windows x86-64

hunter-3.7.0-cp311-cp311-win32.whl (242.3 kB view details)

Uploaded CPython 3.11 Windows x86

hunter-3.7.0-cp311-cp311-musllinux_1_1_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.11 musllinux: musl 1.1+ x86-64

hunter-3.7.0-cp311-cp311-musllinux_1_1_aarch64.whl (1.7 MB view details)

Uploaded CPython 3.11 musllinux: musl 1.1+ ARM64

hunter-3.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

hunter-3.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.7 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

hunter-3.7.0-cp311-cp311-macosx_11_0_arm64.whl (295.3 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

hunter-3.7.0-cp310-cp310-win_amd64.whl (282.1 kB view details)

Uploaded CPython 3.10 Windows x86-64

hunter-3.7.0-cp310-cp310-win32.whl (242.7 kB view details)

Uploaded CPython 3.10 Windows x86

hunter-3.7.0-cp310-cp310-musllinux_1_1_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.10 musllinux: musl 1.1+ x86-64

hunter-3.7.0-cp310-cp310-musllinux_1_1_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.10 musllinux: musl 1.1+ ARM64

hunter-3.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

hunter-3.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

hunter-3.7.0-cp310-cp310-macosx_11_0_arm64.whl (295.3 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

hunter-3.7.0-cp39-cp39-win_amd64.whl (283.0 kB view details)

Uploaded CPython 3.9 Windows x86-64

hunter-3.7.0-cp39-cp39-win32.whl (244.0 kB view details)

Uploaded CPython 3.9 Windows x86

hunter-3.7.0-cp39-cp39-musllinux_1_1_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.9 musllinux: musl 1.1+ x86-64

hunter-3.7.0-cp39-cp39-musllinux_1_1_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.9 musllinux: musl 1.1+ ARM64

hunter-3.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

hunter-3.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

hunter-3.7.0-cp39-cp39-macosx_11_0_arm64.whl (296.7 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

hunter-3.7.0-cp38-cp38-win_amd64.whl (283.6 kB view details)

Uploaded CPython 3.8 Windows x86-64

hunter-3.7.0-cp38-cp38-win32.whl (243.6 kB view details)

Uploaded CPython 3.8 Windows x86

hunter-3.7.0-cp38-cp38-musllinux_1_1_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.8 musllinux: musl 1.1+ x86-64

hunter-3.7.0-cp38-cp38-musllinux_1_1_aarch64.whl (1.7 MB view details)

Uploaded CPython 3.8 musllinux: musl 1.1+ ARM64

hunter-3.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

hunter-3.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.7 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

hunter-3.7.0-cp38-cp38-macosx_11_0_arm64.whl (296.7 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: hunter-3.7.0.tar.gz
  • Upload date:
  • Size: 672.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.8

File hashes

Hashes for hunter-3.7.0.tar.gz
Algorithm Hash digest
SHA256 16f4fb4dbde366bac61ebf235bc4d075bfd8748009c8a4e0327d2fbca6f611d6
MD5 61c0c6f0ae46b6de1c385b3b7b36c345
BLAKE2b-256 8f92f21e6066609232e5fa564b98ece34eaab70caee2e854ea1b45776a33edcb

See more details on using hashes here.

File details

Details for the file hunter-3.7.0-pp310.pp38.pp39-none-any.whl.

File metadata

File hashes

Hashes for hunter-3.7.0-pp310.pp38.pp39-none-any.whl
Algorithm Hash digest
SHA256 b9955013d2e8eb4d0472823153086cba7c36f894ea3acab43aface1d9d27444c
MD5 57b8ff39889a8536454ee1b06aa2855b
BLAKE2b-256 13238549752fc57eff4b1ae113703b4d7943180b0aedb9d3513126b3605ca03f

See more details on using hashes here.

File details

Details for the file hunter-3.7.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: hunter-3.7.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 279.4 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.8

File hashes

Hashes for hunter-3.7.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 d1e72f28d81c67921548f504afc254f5bd96128ef92ecbf17946a145752a6602
MD5 134a7601af4a5b6ef6f0bb6f25347ca5
BLAKE2b-256 5ce35c46f1deded043c4390cb268595dd6e19f97517c16b7252d542073b66c7c

See more details on using hashes here.

File details

Details for the file hunter-3.7.0-cp312-cp312-win32.whl.

File metadata

  • Download URL: hunter-3.7.0-cp312-cp312-win32.whl
  • Upload date:
  • Size: 241.1 kB
  • Tags: CPython 3.12, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.8

File hashes

Hashes for hunter-3.7.0-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 b73aa7eeb5990807698692367f874fb746d9ffb45430fb07ef497ac9fb7ad63c
MD5 0998796e37c367e3f1d09c5d578d9e84
BLAKE2b-256 b974576bb43d99abeec2a189424c5a88fc0a65fd50422608672ec64631ecb40a

See more details on using hashes here.

File details

Details for the file hunter-3.7.0-cp312-cp312-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for hunter-3.7.0-cp312-cp312-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 fa34b19b00be465054f1001158e6ac89511ce7b3bb40f8e7bc56a9ae18184c5b
MD5 c0a1cffbce7204c26c2eaf6b19d74d34
BLAKE2b-256 e2f6b2a0b707ce4c03a16ead5d200bf430d50e0eb4120622b2bda02f6e963e12

See more details on using hashes here.

File details

Details for the file hunter-3.7.0-cp312-cp312-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for hunter-3.7.0-cp312-cp312-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 161bc2b522449696d06943c0fdc61219c15f8a407d4f06ddfc71689e43a77d80
MD5 1402907971219e37b7154773f5672b7e
BLAKE2b-256 9050674d31e1ee47eec0ef78ccb57b8327b12cc23dcb158e080c1f5490c0372c

See more details on using hashes here.

File details

Details for the file hunter-3.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for hunter-3.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ab774df3dcf99c1b933afe91c1d5ed7e9bfa53826bd88c7b37cd0650db9e4ce9
MD5 fc449795cfcd9c4f4e1752d352a2a0a9
BLAKE2b-256 ccc544aac92dbc04c6cad054558676c87745a4117a71d510863943c82def6885

See more details on using hashes here.

File details

Details for the file hunter-3.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for hunter-3.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e8948f11a0dfb3d19112cf67539d9ade7517ea22c5b3471b0566c7d62075f090
MD5 8a861d616091075f76486d97a3ffe33a
BLAKE2b-256 6a7e2b45e6cfbd198a568342695515b9c31e780e27d3c73691e73ad5f87b709a

See more details on using hashes here.

File details

Details for the file hunter-3.7.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for hunter-3.7.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c5aebe6d72749d509a2001ebf4bc6cba2a6bafb7dd645b8a6a027dcc2c966465
MD5 3888858d6229337eb921cee391cfb267
BLAKE2b-256 43d720c368f004ae0701fe713c5560a6e917357f1fa4f54aa15dee858e273101

See more details on using hashes here.

File details

Details for the file hunter-3.7.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: hunter-3.7.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 282.4 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.8

File hashes

Hashes for hunter-3.7.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 6d32a1c3ead5347325f92b90299f4e049b8cdea45a7682312187a34f0ecdbf43
MD5 f407da34ef69cf86b3f43308b87ffdcf
BLAKE2b-256 6861c2fb157aae9453580b6bec835a482f4bd54585f4dc8cb891f73ccaf55a60

See more details on using hashes here.

File details

Details for the file hunter-3.7.0-cp311-cp311-win32.whl.

File metadata

  • Download URL: hunter-3.7.0-cp311-cp311-win32.whl
  • Upload date:
  • Size: 242.3 kB
  • Tags: CPython 3.11, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.8

File hashes

Hashes for hunter-3.7.0-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 c810b56999576a8313793d4da64b857165e97a8f6f6a3b161f13c8b285324dd4
MD5 6f1d501b134699c97de386d0bbc1d8d3
BLAKE2b-256 9222c6be40b4f72d56aa2a2340b44cf3a3e69dd16f182704bffdb4c181006f45

See more details on using hashes here.

File details

Details for the file hunter-3.7.0-cp311-cp311-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for hunter-3.7.0-cp311-cp311-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 1fe660d266547f85644bce8230e714e6984bfaa94e8513d77c8c8b5562aeefae
MD5 71fe753358604d26839b21a70141bed8
BLAKE2b-256 73d56015311386c1776d0866abd206e2d718b1718009c0fd90b8f848e00815f3

See more details on using hashes here.

File details

Details for the file hunter-3.7.0-cp311-cp311-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for hunter-3.7.0-cp311-cp311-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 403a54ba425dda94cb00ebc47c71a2e7c8e8c2e4188dc9b1b6848ce2e13059d0
MD5 b12c967eabbdc1c44e246c688283b16b
BLAKE2b-256 3ec46378617564856d629a88bd5a9c984497f53fe01af0e9ff38bd838fd1aa3d

See more details on using hashes here.

File details

Details for the file hunter-3.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for hunter-3.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e3b94da39b1881492cfda6f4630c27815c17823078ddefb9dfaf3d79d0c7ee89
MD5 e63b8bb9f4316ea25a858be2969e6047
BLAKE2b-256 9b142644682b1584559b51615d539763c565c029fd46cdcceb93ced14e07775a

See more details on using hashes here.

File details

Details for the file hunter-3.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for hunter-3.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 1c3516266c3dceae92636c7f21808f0ca2cd571d368bff79da57c7fb505398f5
MD5 3891ad1123de5ebf4cf3806c1ad3c3ea
BLAKE2b-256 747f9499b1e3b533f323ec61b4af566efe8ea27d665b6dfabb24e7c7ef346615

See more details on using hashes here.

File details

Details for the file hunter-3.7.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for hunter-3.7.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 94efe2df941a6186e0aa7fc0b87df6686d9455ac77fc48f67a0d10237397591f
MD5 60aa488c7d47cf6e3a48ec2b168c6850
BLAKE2b-256 ba1cee08e1a9fe5715e435c468a841f632a63b67553bc7a4c51c25fc100d186c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: hunter-3.7.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 282.1 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.8

File hashes

Hashes for hunter-3.7.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 f13c81c03cf1a7bab4d63ffd952b6f6f0c4df9ea90461c1e0174ce68cf175a08
MD5 4e8d1953a20226443d2d7f1c85a93cfe
BLAKE2b-256 fe7c1c3e25ef449647d626725fd2d90f7cd8a80a12228d3c36b6b0c12748d3d6

See more details on using hashes here.

File details

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

File metadata

  • Download URL: hunter-3.7.0-cp310-cp310-win32.whl
  • Upload date:
  • Size: 242.7 kB
  • Tags: CPython 3.10, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.8

File hashes

Hashes for hunter-3.7.0-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 f6c2ef27930b1973e5bda559d7ae449336328576362a15992504aa97ccb06ecb
MD5 5ff0a643e40da8e4616dfa6e072af95c
BLAKE2b-256 3ef14e149c4d3424032394b96bd02c799987f32985d2ff516a20bc6c4b79bed4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for hunter-3.7.0-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 5c1c28456cf4f04a3aeee0a7b5807d1aec0ac25806252421948b5db6daffd522
MD5 78a8b439c591b0bd745b060fa2bb8a88
BLAKE2b-256 38f9b31b69d369cbc678124a939f59842a3ad1ec097dcdbd6070fa067de16fa7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for hunter-3.7.0-cp310-cp310-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 2d44d0d47e7c37b0e9790fa8141f3cbdc4208a5562b26ba05efb956f2681e0ed
MD5 ecd15be6cc07392888bf45b5aa708726
BLAKE2b-256 3706b68e84e4f6fa05947f7a93facf5c68955cb6fa4dafa35a25ad02a3af5899

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for hunter-3.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 76bb34aafc609e711d436f70bc29a7ebcd9179c0ef827c7ba96da2d4c91bc4a3
MD5 4cf70904ba4a98d3604241b0f51b1a98
BLAKE2b-256 366c9d9a742bb4d78a74e9e2f1c7c579e839a5d71e9369c7fe342055fcade455

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for hunter-3.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 7bf1a6eeed9c3d1d87cc436d8be099626416e2ca0ca487100b7ada5e48e7ae72
MD5 6b74ed8c427d724342df9cb5832adbba
BLAKE2b-256 84ec3bc2477a7d8b22bf40b99bea303cf5b585f9da21ab43bc34b1f2b4d5b969

See more details on using hashes here.

File details

Details for the file hunter-3.7.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for hunter-3.7.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0107fef8c95aa9574f42f2c6e4de97dc205f18dbc81c1789f1eedf2cb28da21a
MD5 a1472faf999fdb9876d5fd3568c192fa
BLAKE2b-256 a1a1232a39e9ca8afd597509046f27f6460f17078bf54aea86197ff2d7631e73

See more details on using hashes here.

File details

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

File metadata

  • Download URL: hunter-3.7.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 283.0 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.8

File hashes

Hashes for hunter-3.7.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 36b149cd8b7eb2af007bd69ce79f64452c7cb03a0d136764ed8261da7bce3501
MD5 c149d9c5595671b30629d406eb9c4c90
BLAKE2b-256 eacc37efecf3498944d30739e95d17481c2b8f39f357e469aeee10dd3ff3cc2f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: hunter-3.7.0-cp39-cp39-win32.whl
  • Upload date:
  • Size: 244.0 kB
  • Tags: CPython 3.9, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.8

File hashes

Hashes for hunter-3.7.0-cp39-cp39-win32.whl
Algorithm Hash digest
SHA256 2169ef7e92ca57f2829a2d9291ba5ead093c197b330ba6630871715964ea4ba1
MD5 6d7db5758a917fdea614f922f3071f37
BLAKE2b-256 901d56069c6f30e6a95b3af226d53524feabceee20865694abcdce39faa9925b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for hunter-3.7.0-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 49b0da542802a5c873f9e6a7ec95c52428e3565e1922386f5df0e20b907f47d9
MD5 d1b4de8a3d129b06d4b1ac845c839d36
BLAKE2b-256 309543e74b75e8b0671ca6c76a62e5eb1ed917c64b085f4d217093bae771c4d3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for hunter-3.7.0-cp39-cp39-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 b97bf277f4471f9061d7c6f9c23ce66f5132fb98374d5ee28f55310eecd5fe1f
MD5 6cfeaeac8ddb64b647d1e2df0abef934
BLAKE2b-256 ee5e81899db03bbca74cb989685571f59ca85955e0d80616b53106ae178bb467

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for hunter-3.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 57e0895d1b1b7ad57204ec484c08cb720d5a2fcbe7c4f8f05add05c0dc1527eb
MD5 726b44a083244bd9540f564530f229f9
BLAKE2b-256 dcfcab11568de8ed772dbd395452b340a0c7c92ea1d8d7b741e74a956a023abf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for hunter-3.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 0de84cbf88b6f57ce573cd46f64493cb3e0739e689a8895d932cbcb631691d9b
MD5 cd42feedd556a1ee84cb438c8a069b23
BLAKE2b-256 575cfb632014859fb3d5bdd73e33592c8b4f701a5392f87ba6488479d41bbe92

See more details on using hashes here.

File details

Details for the file hunter-3.7.0-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for hunter-3.7.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d186c17739326dc3a3fa0df96bcfaf25b2fd057d6689554f7a64c422309bba57
MD5 7b52e7b22e7ec31bc0a3add0e3657dd8
BLAKE2b-256 5a4c8e81104585aada1ff1972867f5d464b34df588dd69eec1ae24074372f51f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: hunter-3.7.0-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 283.6 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.8

File hashes

Hashes for hunter-3.7.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 e5b97f8dbd1e909f8366ed7a23deacc5c488b3a0ddf00f1ca958753fa46181fe
MD5 0dc316f5558b1c06ad5fb1d1c124d01a
BLAKE2b-256 fe0f688db51fa762b92bc6a6f3e0dbc3b15e2dabe99573a6a07acf305430da12

See more details on using hashes here.

File details

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

File metadata

  • Download URL: hunter-3.7.0-cp38-cp38-win32.whl
  • Upload date:
  • Size: 243.6 kB
  • Tags: CPython 3.8, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.8

File hashes

Hashes for hunter-3.7.0-cp38-cp38-win32.whl
Algorithm Hash digest
SHA256 5c997df47fcb03445a08007e15b9d78b35d92aa21334b2889527393a8ae716e2
MD5 28ca2702affb0259b1191fbd51b6f006
BLAKE2b-256 031975c397617825b485ed2d7f142829eef04bff12b7de29a3d004d5ea9a9ec2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for hunter-3.7.0-cp38-cp38-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 6602b5d90a0cd2ff8feac470a78c412bed79226608afb0ff6d416b7008a47ae0
MD5 4f026c7a48bbe90c27564503372863ca
BLAKE2b-256 867772a79a98c5d9e7fad27787fc69cc18ca42d0aa2d0e251006173ba97402af

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for hunter-3.7.0-cp38-cp38-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 7f3a5d81d665bf986ca557817006cbe85b5a89d08ec7fe795c1c1ad0d254868b
MD5 4b0f67bbcc2488eec9295ba3c2b34d01
BLAKE2b-256 9524340afcf8cbeb6325469394521761e7b4f6359be8cc44b937a81ff96a5831

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for hunter-3.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e795e8de62f3132d52b655033e444a17e4179d902f91fd4d5ba8936452b23a57
MD5 9061cae47856ac090ed05001ec05b9e0
BLAKE2b-256 e4cb02f74d95f64be2c4e584f38e8b5fb8aeb915af1b98e439b19f95b4e06857

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for hunter-3.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 5473821bd45973443ca6053b9fd64bf62bff78914b25f8c6d9460c0ffdbdc956
MD5 c26ca188d95212b5c8ac7ebd6023fa73
BLAKE2b-256 a525874f01ac6f5333c12c96e03ba2c97e7626f39facbd0bb6cd237095af04ca

See more details on using hashes here.

File details

Details for the file hunter-3.7.0-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for hunter-3.7.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4eda5403e1a142daea018736a31818d41f7ecbf39808d0a13a67d6d2641a317b
MD5 00f271108f97afb498ace910f17f1cd5
BLAKE2b-256 f7197bf2ee32e2b85f9a1de607cd47cbff72542fdfae8f5f3b0821d676c9ef11

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page