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/

Overview

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.5/posixpath.py:71    call      => join(a='a')
         /usr/lib/python3.5/posixpath.py:76    line         sep = _get_sep(a)
         /usr/lib/python3.5/posixpath.py:39    call         => _get_sep(path='a')
         /usr/lib/python3.5/posixpath.py:40    line            if isinstance(path, bytes):
         /usr/lib/python3.5/posixpath.py:43    line            return '/'
         /usr/lib/python3.5/posixpath.py:43    return       <= _get_sep: '/'
         /usr/lib/python3.5/posixpath.py:77    line         path = a
         /usr/lib/python3.5/posixpath.py:78    line         try:
         /usr/lib/python3.5/posixpath.py:79    line         if not p:
         /usr/lib/python3.5/posixpath.py:81    line         for b in p:
         /usr/lib/python3.5/posixpath.py:82    line         if b.startswith(sep):
         /usr/lib/python3.5/posixpath.py:84    line         elif not path or path.endswith(sep):
         /usr/lib/python3.5/posixpath.py:87    line         path += sep + b
         /usr/lib/python3.5/posixpath.py:81    line         for b in p:
         /usr/lib/python3.5/posixpath.py:91    line         return path
         /usr/lib/python3.5/posixpath.py:91    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

Custom 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). 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.5/posixpath.py:71    call      def join(a, *p):
         /usr/lib/python3.5/posixpath.py:76    line          sep = _get_sep(a)
         /usr/lib/python3.5/posixpath.py:39    call      def _get_sep(path):
         /usr/lib/python3.5/posixpath.py:40    line          if isinstance(path, bytes):
         /usr/lib/python3.5/posixpath.py:43    line              return '/'
         /usr/lib/python3.5/posixpath.py:43    return            return '/'
                                               ...       return value: '/'
         /usr/lib/python3.5/posixpath.py:77    line          path = a
         /usr/lib/python3.5/posixpath.py:78    line          try:
         /usr/lib/python3.5/posixpath.py:79    line              if not p:
         /usr/lib/python3.5/posixpath.py:81    line              for b in p:
         /usr/lib/python3.5/posixpath.py:82    line                  if b.startswith(sep):
         /usr/lib/python3.5/posixpath.py:84    line                  elif not path or path.endswith(sep):
         /usr/lib/python3.5/posixpath.py:87    line                      path += sep + b
         /usr/lib/python3.5/posixpath.py:81    line              for b in p:
         /usr/lib/python3.5/posixpath.py:91    line          return path
         /usr/lib/python3.5/posixpath.py:91    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.5/posixpath.py:71    call      def join(a, *p):
         /usr/lib/python3.5/posixpath.py:76    line          sep = _get_sep(a)
                                               vars      path => 'a'
         /usr/lib/python3.5/posixpath.py:39    call      def _get_sep(path):
                                               vars      path => 'a'
         /usr/lib/python3.5/posixpath.py:40    line          if isinstance(path, bytes):
                                               vars      path => 'a'
         /usr/lib/python3.5/posixpath.py:43    line              return '/'
                                               vars      path => 'a'
         /usr/lib/python3.5/posixpath.py:43    return            return '/'
                                               ...       return value: '/'
         /usr/lib/python3.5/posixpath.py:77    line          path = a
                                               vars      path => 'a'
         /usr/lib/python3.5/posixpath.py:78    line          try:
                                               vars      path => 'a'
         /usr/lib/python3.5/posixpath.py:79    line              if not p:
                                               vars      path => 'a'
         /usr/lib/python3.5/posixpath.py:81    line              for b in p:
                                               vars      path => 'a'
         /usr/lib/python3.5/posixpath.py:82    line                  if b.startswith(sep):
                                               vars      path => 'a'
         /usr/lib/python3.5/posixpath.py:84    line                  elif not path or path.endswith(sep):
                                               vars      path => 'a'
         /usr/lib/python3.5/posixpath.py:87    line                      path += sep + b
                                               vars      path => 'a/b'
         /usr/lib/python3.5/posixpath.py:81    line              for b in p:
                                               vars      path => 'a/b'
         /usr/lib/python3.5/posixpath.py:91    line          return path
                                               vars      path => 'a/b'
         /usr/lib/python3.5/posixpath.py:91    return        return path
                                               ...       return value: '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 pip install 'hunter[remote]' and 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_sw='django')"
    PYTHONHUNTER="Q(module_sw='celery')"

    which is the equivalent of:

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

    which is the equivalent of:

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

Filtering DSL

Hunter supports a flexible query DSL, see the introduction.

Development

To run the all tests run:

tox

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.

TODO: Expand this.

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.

Changelog

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 CallPrinter action (shoudln’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 Event.count and Event.calls attributes.

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

  • Added convenience aliases for startswith (sw), endswith (ew) 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 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 Event.thread.

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

  • Added threading_support argument to hunter.trace: makes new threads be traced and changes action output to include threadname.

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

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

  • Made the handler a public but readonly property of Tracer objects.

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 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 VarsPrinter’s initializer.

  • Added a 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 VarsPrinter and CodePrinter.

  • Allowed setting the stream to a file name (option on VarsPrinter and 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 Event.globals to actually be the dict of global vars (it was just the locals).

0.5.0 (2015-04-06)

  • Fixed And and Or “single argument unwrapping”.

  • Implemented predicate compression. Example: Or(Or(a, b), c) is converted to Or(a, b, c).

  • Renamed the Event.source to Event.fullsource.

  • Added Event.source that doesn’t do any fancy sourcecode tokenization.

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

  • Breaking changes:

    • Renamed F to Q. And Q is now just a convenience wrapper for Query.

    • Renamed the PYTHON_HUNTER env variable to PYTHONHUNTER.

    • Changed When to take positional arguments.

    • Changed output to show 2 path components (still not configurable).

    • Changed VarsPrinter to take positional arguments for the names.

  • Improved error reporting for env variable activation (PYTHONHUNTER).

  • Fixed env var activator (the .pth file) installation with setup.py install (the “egg installs”) and setup.py develop/pip install -e (the “egg links”).

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

Uploaded Source

Built Distributions

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

hunter-2.1.0-cp37-cp37m-win_amd64.whl (413.1 kB view details)

Uploaded CPython 3.7mWindows x86-64

hunter-2.1.0-cp37-cp37m-win32.whl (383.5 kB view details)

Uploaded CPython 3.7mWindows x86

hunter-2.1.0-cp37-cp37m-manylinux1_x86_64.whl (971.9 kB view details)

Uploaded CPython 3.7m

hunter-2.1.0-cp37-cp37m-macosx_10_6_intel.whl (615.0 kB view details)

Uploaded CPython 3.7mmacOS 10.6+ Intel (x86-64, i386)

hunter-2.1.0-cp36-cp36m-win_amd64.whl (428.4 kB view details)

Uploaded CPython 3.6mWindows x86-64

hunter-2.1.0-cp36-cp36m-win32.whl (396.6 kB view details)

Uploaded CPython 3.6mWindows x86

hunter-2.1.0-cp36-cp36m-manylinux1_x86_64.whl (986.0 kB view details)

Uploaded CPython 3.6m

hunter-2.1.0-cp36-cp36m-macosx_10_6_intel.whl (626.8 kB view details)

Uploaded CPython 3.6mmacOS 10.6+ Intel (x86-64, i386)

hunter-2.1.0-cp35-cp35m-win_amd64.whl (424.5 kB view details)

Uploaded CPython 3.5mWindows x86-64

hunter-2.1.0-cp35-cp35m-win32.whl (393.2 kB view details)

Uploaded CPython 3.5mWindows x86

hunter-2.1.0-cp35-cp35m-manylinux1_x86_64.whl (965.2 kB view details)

Uploaded CPython 3.5m

hunter-2.1.0-cp35-cp35m-macosx_10_6_intel.whl (604.1 kB view details)

Uploaded CPython 3.5mmacOS 10.6+ Intel (x86-64, i386)

hunter-2.1.0-cp34-cp34m-win_amd64.whl (417.9 kB view details)

Uploaded CPython 3.4mWindows x86-64

hunter-2.1.0-cp34-cp34m-win32.whl (392.8 kB view details)

Uploaded CPython 3.4mWindows x86

hunter-2.1.0-cp34-cp34m-manylinux1_x86_64.whl (991.5 kB view details)

Uploaded CPython 3.4m

hunter-2.1.0-cp34-cp34m-macosx_10_6_intel.whl (600.4 kB view details)

Uploaded CPython 3.4mmacOS 10.6+ Intel (x86-64, i386)

hunter-2.1.0-cp27-cp27mu-manylinux1_x86_64.whl (902.3 kB view details)

Uploaded CPython 2.7mu

hunter-2.1.0-cp27-cp27m-win_amd64.whl (420.0 kB view details)

Uploaded CPython 2.7mWindows x86-64

hunter-2.1.0-cp27-cp27m-win32.whl (391.1 kB view details)

Uploaded CPython 2.7mWindows x86

hunter-2.1.0-cp27-cp27m-manylinux1_x86_64.whl (902.1 kB view details)

Uploaded CPython 2.7m

hunter-2.1.0-cp27-cp27m-macosx_10_6_intel.whl (605.4 kB view details)

Uploaded CPython 2.7mmacOS 10.6+ Intel (x86-64, i386)

File details

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

File metadata

  • Download URL: hunter-2.1.0.tar.gz
  • Upload date:
  • Size: 427.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.18.4 setuptools/40.4.3 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.6

File hashes

Hashes for hunter-2.1.0.tar.gz
Algorithm Hash digest
SHA256 c72a761228e3a9c0ccb301797fa30c5b4b09f66b79b3e2f20d8da729c217a0a3
MD5 fb3b63d483a22fc6525313e2901a2ee7
BLAKE2b-256 cc5e3568b25a97e9fdaf76fff490c889bc81f1097b95583cd13fae3788aab54b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: hunter-2.1.0-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 413.1 kB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.18.4 setuptools/40.4.3 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.6

File hashes

Hashes for hunter-2.1.0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 bdfa917007e073a1cd2dfad4ad43864484d15cad440a68012f646c1b76aaa68a
MD5 cddd3f8b441860ca27e861743ad9da98
BLAKE2b-256 fb446d4ab9cc9613b7670a7bfa5d47a585b7bdf25fffe45053038564dadc0aa2

See more details on using hashes here.

File details

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

File metadata

  • Download URL: hunter-2.1.0-cp37-cp37m-win32.whl
  • Upload date:
  • Size: 383.5 kB
  • Tags: CPython 3.7m, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.18.4 setuptools/40.4.3 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.6

File hashes

Hashes for hunter-2.1.0-cp37-cp37m-win32.whl
Algorithm Hash digest
SHA256 17e94106190e4a402cf8f64ea8a84a61dc3915bc31b4e0ec73a924028204d47c
MD5 ea40effb0121c0d19a641dc8f8e929ba
BLAKE2b-256 3b03df5de50af2d5079041facc1f708d2470109742f1186698750ec539749058

See more details on using hashes here.

File details

Details for the file hunter-2.1.0-cp37-cp37m-manylinux1_x86_64.whl.

File metadata

  • Download URL: hunter-2.1.0-cp37-cp37m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 971.9 kB
  • Tags: CPython 3.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.18.4 setuptools/40.4.3 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.6

File hashes

Hashes for hunter-2.1.0-cp37-cp37m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 31e0c511f57857066340e728f736f6173ea5f44419be8943ae9bd32427454600
MD5 ea8b8c0ea3e15eda395760b8aa0da7d3
BLAKE2b-256 9c2f021b9d55450a928edfac9aab13029f5fc7b9e10d3c2b521a9c7abc6e7a3e

See more details on using hashes here.

File details

Details for the file hunter-2.1.0-cp37-cp37m-macosx_10_6_intel.whl.

File metadata

  • Download URL: hunter-2.1.0-cp37-cp37m-macosx_10_6_intel.whl
  • Upload date:
  • Size: 615.0 kB
  • Tags: CPython 3.7m, macOS 10.6+ Intel (x86-64, i386)
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.1 setuptools/39.0.1 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.7.1

File hashes

Hashes for hunter-2.1.0-cp37-cp37m-macosx_10_6_intel.whl
Algorithm Hash digest
SHA256 cc8008ec4c08cdf3ac292b4a14846bf364d03a5eb6e6aaf26f2218b3e7083101
MD5 0eb93bacd6c611b618f5b978cbf8ea73
BLAKE2b-256 6ba1c44d15be09e18bf9e3fe6a7f5b9eaea854bb24ec612b2e0d43edce25f180

See more details on using hashes here.

File details

Details for the file hunter-2.1.0-cp36-cp36m-win_amd64.whl.

File metadata

  • Download URL: hunter-2.1.0-cp36-cp36m-win_amd64.whl
  • Upload date:
  • Size: 428.4 kB
  • Tags: CPython 3.6m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.18.4 setuptools/40.4.3 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.6

File hashes

Hashes for hunter-2.1.0-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 1e30985ab9c3c255b64e9f45cad331bf8cf1badd6d0a489262c7396a9ee0df86
MD5 ad6a0977a7b53e6cb4f738c562602131
BLAKE2b-256 a0758bc7da1ee0f0d51698ef13095d26984e9f541bca26e147780314a09ce0e5

See more details on using hashes here.

File details

Details for the file hunter-2.1.0-cp36-cp36m-win32.whl.

File metadata

  • Download URL: hunter-2.1.0-cp36-cp36m-win32.whl
  • Upload date:
  • Size: 396.6 kB
  • Tags: CPython 3.6m, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.18.4 setuptools/40.4.3 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.6

File hashes

Hashes for hunter-2.1.0-cp36-cp36m-win32.whl
Algorithm Hash digest
SHA256 4e5481ec9236069d7f1e9df2af87c9f3e25c7b906a5b3a683eafa2800ba5ac31
MD5 66e1c8d90281443f6df09bcb0ce7527b
BLAKE2b-256 165414418fa1d94b64df71ca2205dbcef5fe83662b68d999279b52ea9f123cfb

See more details on using hashes here.

File details

Details for the file hunter-2.1.0-cp36-cp36m-manylinux1_x86_64.whl.

File metadata

  • Download URL: hunter-2.1.0-cp36-cp36m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 986.0 kB
  • Tags: CPython 3.6m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.18.4 setuptools/40.4.3 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.6

File hashes

Hashes for hunter-2.1.0-cp36-cp36m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 ffb47cf51ca52dd4078c13bd18c8ef9be9de94f5878308b3c9ab939ab4f817f6
MD5 f2d05a7354f7b3f390a3c79f4a9ec60a
BLAKE2b-256 eec171c8eaa732cd6a77cf85b17095279efbd4fd1dcb3ccc94115f6cb82935b4

See more details on using hashes here.

File details

Details for the file hunter-2.1.0-cp36-cp36m-macosx_10_6_intel.whl.

File metadata

  • Download URL: hunter-2.1.0-cp36-cp36m-macosx_10_6_intel.whl
  • Upload date:
  • Size: 626.8 kB
  • Tags: CPython 3.6m, macOS 10.6+ Intel (x86-64, i386)
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.1 setuptools/39.0.1 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.7.1

File hashes

Hashes for hunter-2.1.0-cp36-cp36m-macosx_10_6_intel.whl
Algorithm Hash digest
SHA256 9604320723a6e53ca88c1da0c1bcfd14eee68287c3956f9ddffe18a664fbde95
MD5 f33c6aceec80f9d1c7310e9375f437ac
BLAKE2b-256 c4a0a0bf777dced06644967d1500bc2c550f9760207eb1b5692bc473ce0830d2

See more details on using hashes here.

File details

Details for the file hunter-2.1.0-cp35-cp35m-win_amd64.whl.

File metadata

  • Download URL: hunter-2.1.0-cp35-cp35m-win_amd64.whl
  • Upload date:
  • Size: 424.5 kB
  • Tags: CPython 3.5m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.18.4 setuptools/40.4.3 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.6

File hashes

Hashes for hunter-2.1.0-cp35-cp35m-win_amd64.whl
Algorithm Hash digest
SHA256 5a1fd1b9631af7f4e6350d9c6551edb39a14df9c7111f479c778c00fe5e1a4c8
MD5 11ad15451a6617fa645ac2bcbb584292
BLAKE2b-256 e89bafae6d133ab23f758d24280b15ab624d4685b061308458ba39cff9fc57e2

See more details on using hashes here.

File details

Details for the file hunter-2.1.0-cp35-cp35m-win32.whl.

File metadata

  • Download URL: hunter-2.1.0-cp35-cp35m-win32.whl
  • Upload date:
  • Size: 393.2 kB
  • Tags: CPython 3.5m, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.18.4 setuptools/40.4.3 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.6

File hashes

Hashes for hunter-2.1.0-cp35-cp35m-win32.whl
Algorithm Hash digest
SHA256 3f46bd04d098a81e440feeaf68190f8eac6d23d6617665bab05df0a29633e002
MD5 ea01f0109cda76a23c8cb16eaf849344
BLAKE2b-256 d004e2a825df4e217506364c99d1908bc9e9304422373a4102a32ac7cfc71e63

See more details on using hashes here.

File details

Details for the file hunter-2.1.0-cp35-cp35m-manylinux1_x86_64.whl.

File metadata

  • Download URL: hunter-2.1.0-cp35-cp35m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 965.2 kB
  • Tags: CPython 3.5m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.18.4 setuptools/40.4.3 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.6

File hashes

Hashes for hunter-2.1.0-cp35-cp35m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 1589353276d7c5c16c44025a77dacde1c8fbf631fa244e746994e02dfdb5182e
MD5 4ac473e1510e78f113c1cfc2991707ca
BLAKE2b-256 eba303276c6133ed9d8a70322e01e748b479087b42288d137a9f60c2c082d926

See more details on using hashes here.

File details

Details for the file hunter-2.1.0-cp35-cp35m-macosx_10_6_intel.whl.

File metadata

  • Download URL: hunter-2.1.0-cp35-cp35m-macosx_10_6_intel.whl
  • Upload date:
  • Size: 604.1 kB
  • Tags: CPython 3.5m, macOS 10.6+ Intel (x86-64, i386)
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.1 setuptools/39.0.1 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.7.1

File hashes

Hashes for hunter-2.1.0-cp35-cp35m-macosx_10_6_intel.whl
Algorithm Hash digest
SHA256 9d199f89b7c36c8918e62092afc6d125039094cda3a93e80881b25b4d54838d8
MD5 713345208774f55a74a687b4edaf6b83
BLAKE2b-256 4824fbe53d72332331821d9f8c911a960679732cf49d36310ee7a9fb05b13bf6

See more details on using hashes here.

File details

Details for the file hunter-2.1.0-cp34-cp34m-win_amd64.whl.

File metadata

  • Download URL: hunter-2.1.0-cp34-cp34m-win_amd64.whl
  • Upload date:
  • Size: 417.9 kB
  • Tags: CPython 3.4m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.18.4 setuptools/40.4.3 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.6

File hashes

Hashes for hunter-2.1.0-cp34-cp34m-win_amd64.whl
Algorithm Hash digest
SHA256 e498e45c6e819562260cc0d37f3874af87e36999661a19b9691fd25ca42fa26b
MD5 cb0745627d88cc65e011bb6bf74611a3
BLAKE2b-256 afae8e08b138d0c7f4e4b632da659ff2a1df1479b4870d335f1056b0f9f0a602

See more details on using hashes here.

File details

Details for the file hunter-2.1.0-cp34-cp34m-win32.whl.

File metadata

  • Download URL: hunter-2.1.0-cp34-cp34m-win32.whl
  • Upload date:
  • Size: 392.8 kB
  • Tags: CPython 3.4m, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.18.4 setuptools/40.4.3 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.6

File hashes

Hashes for hunter-2.1.0-cp34-cp34m-win32.whl
Algorithm Hash digest
SHA256 90fb07249601bd22253647301646b38cf098e0b93ce7c89ebe9af5749016fd03
MD5 d95e23a2178b9b357cdc110c666c501b
BLAKE2b-256 7d4c2d95dde946aa6cdb8389fb355501ca85094efd676c0f7c2aa117d8364c2c

See more details on using hashes here.

File details

Details for the file hunter-2.1.0-cp34-cp34m-manylinux1_x86_64.whl.

File metadata

  • Download URL: hunter-2.1.0-cp34-cp34m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 991.5 kB
  • Tags: CPython 3.4m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.18.4 setuptools/40.4.3 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.6

File hashes

Hashes for hunter-2.1.0-cp34-cp34m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 e79da8e3a451afd855855fd360f1b351bddd6b3d8abbc95fec785e5691d3c56c
MD5 5a37f8164473c329705f0839a680ece4
BLAKE2b-256 f9304ddaf441ab95783e395594d333d75a5757a0152c9976857980c140613ca5

See more details on using hashes here.

File details

Details for the file hunter-2.1.0-cp34-cp34m-macosx_10_6_intel.whl.

File metadata

  • Download URL: hunter-2.1.0-cp34-cp34m-macosx_10_6_intel.whl
  • Upload date:
  • Size: 600.4 kB
  • Tags: CPython 3.4m, macOS 10.6+ Intel (x86-64, i386)
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.1 setuptools/39.0.1 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.7.1

File hashes

Hashes for hunter-2.1.0-cp34-cp34m-macosx_10_6_intel.whl
Algorithm Hash digest
SHA256 67c70a143ec5c64d2b22dcff03986719ea22735199277b374b39e3f9eec48228
MD5 0ca10391a72a4dde0c61c1c8a7532d9f
BLAKE2b-256 6e13d006537b13d4134ad8c7b58552555625d8b0ebccab13cc543e628f8c2add

See more details on using hashes here.

File details

Details for the file hunter-2.1.0-cp27-cp27mu-manylinux1_x86_64.whl.

File metadata

  • Download URL: hunter-2.1.0-cp27-cp27mu-manylinux1_x86_64.whl
  • Upload date:
  • Size: 902.3 kB
  • Tags: CPython 2.7mu
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.18.4 setuptools/40.4.3 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.6

File hashes

Hashes for hunter-2.1.0-cp27-cp27mu-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 3e2e407bb5beb4e4a58ea8ea1e9e2fd11cb66bdd8965d1ac09666d92d7d132ea
MD5 87af9ebb6bdf0dd79d2b5977db22a79a
BLAKE2b-256 6abee9de4b5958201ea4e832ce56f9c6ab4222b4c00cbba799ac316f0c5ef86b

See more details on using hashes here.

File details

Details for the file hunter-2.1.0-cp27-cp27m-win_amd64.whl.

File metadata

  • Download URL: hunter-2.1.0-cp27-cp27m-win_amd64.whl
  • Upload date:
  • Size: 420.0 kB
  • Tags: CPython 2.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.18.4 setuptools/40.4.3 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.6

File hashes

Hashes for hunter-2.1.0-cp27-cp27m-win_amd64.whl
Algorithm Hash digest
SHA256 2b2c366d9bdc08b82163449024d033d678180305f7d01bfa9f582b8b36ec5771
MD5 26acf36226af3be1262f93cc04b8333e
BLAKE2b-256 d213946b9428a526e55cd96a21e4b4c73718a6c89309e1b506d9a50739798985

See more details on using hashes here.

File details

Details for the file hunter-2.1.0-cp27-cp27m-win32.whl.

File metadata

  • Download URL: hunter-2.1.0-cp27-cp27m-win32.whl
  • Upload date:
  • Size: 391.1 kB
  • Tags: CPython 2.7m, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.18.4 setuptools/40.4.3 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.6

File hashes

Hashes for hunter-2.1.0-cp27-cp27m-win32.whl
Algorithm Hash digest
SHA256 082ed18b80171b6a75fb5cf5546b9549861bdeb62e030ac26263820c541c8107
MD5 b29bbd8e436d7e330a3141d1df1e5075
BLAKE2b-256 be77f05ea1b3df323277c88b1a90516f1425d0e97edf6ccf9406887fee1c4e3c

See more details on using hashes here.

File details

Details for the file hunter-2.1.0-cp27-cp27m-manylinux1_x86_64.whl.

File metadata

  • Download URL: hunter-2.1.0-cp27-cp27m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 902.1 kB
  • Tags: CPython 2.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.18.4 setuptools/40.4.3 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.6

File hashes

Hashes for hunter-2.1.0-cp27-cp27m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 a9ee88586874d93c8d0c3fd0d34c8f7134d1482898ba15419d80f19385a10295
MD5 f1d610f2277df446ac8c7ec2308f6724
BLAKE2b-256 039413d31d177bbe479271170cbfa5e65e74f32e637f13947d1e581d671277f9

See more details on using hashes here.

File details

Details for the file hunter-2.1.0-cp27-cp27m-macosx_10_6_intel.whl.

File metadata

  • Download URL: hunter-2.1.0-cp27-cp27m-macosx_10_6_intel.whl
  • Upload date:
  • Size: 605.4 kB
  • Tags: CPython 2.7m, macOS 10.6+ Intel (x86-64, i386)
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.1 setuptools/39.0.1 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.7.1

File hashes

Hashes for hunter-2.1.0-cp27-cp27m-macosx_10_6_intel.whl
Algorithm Hash digest
SHA256 763f929987e8a5f4d3a596820eaf92e1a093c7bb739ab2c1a9d53b5d513e92b3
MD5 bd3b6af99a09c7bb573bd4e31640af8b
BLAKE2b-256 41cbe8543df71d2238f0bee567314d14de438d403b54905b8c9c62ec1c3dcb8a

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

3.5.0

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

This release

2.1.0 This release

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