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.2.1 (2019-01-19)

  • Fixed a link in changelog.

  • Fixed some issues in the Travis configuration.

2.2.0 (2019-01-19)

  • Added 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 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.2.1.tar.gz (445.3 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.2.1-cp37-cp37m-win_amd64.whl (190.9 kB view details)

Uploaded CPython 3.7mWindows x86-64

hunter-2.2.1-cp37-cp37m-win32.whl (159.3 kB view details)

Uploaded CPython 3.7mWindows x86

hunter-2.2.1-cp37-cp37m-manylinux1_x86_64.whl (796.9 kB view details)

Uploaded CPython 3.7m

hunter-2.2.1-cp37-cp37m-macosx_10_13_x86_64.whl (218.5 kB view details)

Uploaded CPython 3.7mmacOS 10.13+ x86-64

hunter-2.2.1-cp36-cp36m-win_amd64.whl (191.2 kB view details)

Uploaded CPython 3.6mWindows x86-64

hunter-2.2.1-cp36-cp36m-win32.whl (159.7 kB view details)

Uploaded CPython 3.6mWindows x86

hunter-2.2.1-cp36-cp36m-manylinux1_x86_64.whl (807.0 kB view details)

Uploaded CPython 3.6m

hunter-2.2.1-cp35-cp35m-win_amd64.whl (187.5 kB view details)

Uploaded CPython 3.5mWindows x86-64

hunter-2.2.1-cp35-cp35m-win32.whl (156.5 kB view details)

Uploaded CPython 3.5mWindows x86

hunter-2.2.1-cp35-cp35m-manylinux1_x86_64.whl (786.9 kB view details)

Uploaded CPython 3.5m

hunter-2.2.1-cp34-cp34m-win_amd64.whl (183.9 kB view details)

Uploaded CPython 3.4mWindows x86-64

hunter-2.2.1-cp34-cp34m-win32.whl (158.1 kB view details)

Uploaded CPython 3.4mWindows x86

hunter-2.2.1-cp34-cp34m-manylinux1_x86_64.whl (817.3 kB view details)

Uploaded CPython 3.4m

hunter-2.2.1-cp27-cp27mu-manylinux1_x86_64.whl (720.8 kB view details)

Uploaded CPython 2.7mu

hunter-2.2.1-cp27-cp27m-win_amd64.whl (186.2 kB view details)

Uploaded CPython 2.7mWindows x86-64

hunter-2.2.1-cp27-cp27m-win32.whl (155.9 kB view details)

Uploaded CPython 2.7mWindows x86

hunter-2.2.1-cp27-cp27m-macosx_10_13_x86_64.whl (217.3 kB view details)

Uploaded CPython 2.7mmacOS 10.13+ x86-64

File details

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

File metadata

  • Download URL: hunter-2.2.1.tar.gz
  • Upload date:
  • Size: 445.3 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.7

File hashes

Hashes for hunter-2.2.1.tar.gz
Algorithm Hash digest
SHA256 eda111fb006c7a5704498a3cf560d5959dc96cbeefdda61aba6f6cbb3e476b69
MD5 fa1940bfd7cb6007c1b2a4f7b2ee0558
BLAKE2b-256 ca9345482950628b538b967869b94fc9e338e47209b5ccf3579a854aee4a926b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: hunter-2.2.1-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 190.9 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.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.2.1-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 b92af9b3c780501976c105ac2204fe0f764b1e9f2999887e09acdd47f79cda24
MD5 296574a1488adb30f31c68cba78989f7
BLAKE2b-256 9f7a6f012a6072cf2d5aace11419377f75fe0477aa2105cd6c4f6ee33a5b0987

See more details on using hashes here.

File details

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

File metadata

  • Download URL: hunter-2.2.1-cp37-cp37m-win32.whl
  • Upload date:
  • Size: 159.3 kB
  • Tags: CPython 3.7m, Windows x86
  • 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.2.1-cp37-cp37m-win32.whl
Algorithm Hash digest
SHA256 054f8d9f9d81336250f0d9e054b773defbc69be2110862807634f8425eae71b2
MD5 eafaae1bb790a11ae1c0082ca3d4d2f3
BLAKE2b-256 30ef019571760f54a5b6ed880e1e5d954f76a41eacf8689bb4beee731b686d69

See more details on using hashes here.

File details

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

File metadata

  • Download URL: hunter-2.2.1-cp37-cp37m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 796.9 kB
  • Tags: CPython 3.7m
  • 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.2.1-cp37-cp37m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 17a680ae2b1baaca563fcbf957f33ba8578e8698cc9020a00666c7dd96ca99ec
MD5 03c8bdb8c2ace7e00bc752dafb26be34
BLAKE2b-256 ee90c5f985dbf2777f6b85a00521be406d5b3b1f876f274951afb36bb2707bfc

See more details on using hashes here.

File details

Details for the file hunter-2.2.1-cp37-cp37m-macosx_10_13_x86_64.whl.

File metadata

  • Download URL: hunter-2.2.1-cp37-cp37m-macosx_10_13_x86_64.whl
  • Upload date:
  • Size: 218.5 kB
  • Tags: CPython 3.7m, macOS 10.13+ x86-64
  • 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.2.1-cp37-cp37m-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 f48f6b682811299cbd3e99838b4d0752c85ee8c4d06a8c553d7ff7ac13744a0c
MD5 51fd89c0f8f6490e4c6a9de82224f52b
BLAKE2b-256 74676745c141528ce0e1fbe528cafe7eebf42157f3d99bdaf3ab3cf3ecb9d7e3

See more details on using hashes here.

File details

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

File metadata

  • Download URL: hunter-2.2.1-cp36-cp36m-win_amd64.whl
  • Upload date:
  • Size: 191.2 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.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.2.1-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 90e4a1900c03a97b67b74bd58f6a975daf5ad5a7c74017d5b9a452ad28a79d21
MD5 9e48db51ccfea3a522b78ec87f1a6cf2
BLAKE2b-256 bde4ceea133a5bda0ff63ef89d9671102949b9999931a773c45799c66ad53761

See more details on using hashes here.

File details

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

File metadata

  • Download URL: hunter-2.2.1-cp36-cp36m-win32.whl
  • Upload date:
  • Size: 159.7 kB
  • Tags: CPython 3.6m, Windows x86
  • 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.2.1-cp36-cp36m-win32.whl
Algorithm Hash digest
SHA256 fa8322a470bf34b24bb3d2a73fbce54a2757380cf0148143866266a4d94b00e5
MD5 bbbc405b74122d4c15f82b582be19675
BLAKE2b-256 b3e8068ac1253d6a178e4c7c364e27333b771e5950e22623d61710f0a7054341

See more details on using hashes here.

File details

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

File metadata

  • Download URL: hunter-2.2.1-cp36-cp36m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 807.0 kB
  • Tags: CPython 3.6m
  • 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.2.1-cp36-cp36m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 40689435dc1119f10cba9cbf2b4097e0a2d8d67749dfa08d818482cd2115ccd9
MD5 2f8355674cdeb3ec287addf3dd36922a
BLAKE2b-256 e54447e4ad64acbcf183c9d7a6793a5396227c59cad3af4bfe574b23184e8d7e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: hunter-2.2.1-cp35-cp35m-win_amd64.whl
  • Upload date:
  • Size: 187.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.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.2.1-cp35-cp35m-win_amd64.whl
Algorithm Hash digest
SHA256 6df1008dadff3e023d0ea668a7caa3ca0580333bf9d2e0bce240d8e16332ff29
MD5 c168ca8448350a53fb1a6a01b0bb24cf
BLAKE2b-256 7393d2384a861255c3ba2e598bea084898c0472a9c475e455bd2dc3f82e46a98

See more details on using hashes here.

File details

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

File metadata

  • Download URL: hunter-2.2.1-cp35-cp35m-win32.whl
  • Upload date:
  • Size: 156.5 kB
  • Tags: CPython 3.5m, Windows x86
  • 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.2.1-cp35-cp35m-win32.whl
Algorithm Hash digest
SHA256 182106318ad8983b1ead9583e54a1917a6db12c18c5e9717f044111f1dec2dd5
MD5 ffb2fc9cc939a90918a4b4775c60b6a6
BLAKE2b-256 4aa61bd38c0eb5aefb1d09fd5bb984ba10dba4173a6248b4d43a84effd05bc18

See more details on using hashes here.

File details

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

File metadata

  • Download URL: hunter-2.2.1-cp35-cp35m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 786.9 kB
  • Tags: CPython 3.5m
  • 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.2.1-cp35-cp35m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 9699b9797dcf11a21d8d888562002713c52dc7643ffd4b7d37b6e396c323833b
MD5 c6d3ea3253eaf06f339ea3ba218f044f
BLAKE2b-256 6c6754ff28d51e87b6c6d7f7901d0ef515eaa33b228af3dcd468e9ab99506432

See more details on using hashes here.

File details

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

File metadata

  • Download URL: hunter-2.2.1-cp34-cp34m-win_amd64.whl
  • Upload date:
  • Size: 183.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.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.2.1-cp34-cp34m-win_amd64.whl
Algorithm Hash digest
SHA256 4d5f5602a2590023b9504eb19ff6c8d0d5a92281f9283c4635da706225b3cad5
MD5 eb1bc0bcab38c3240c8d6fb08fa7ddca
BLAKE2b-256 b49d2ed699b64810b698e10dd2e5d3bbe8cbe2381601460474962f8777a07392

See more details on using hashes here.

File details

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

File metadata

  • Download URL: hunter-2.2.1-cp34-cp34m-win32.whl
  • Upload date:
  • Size: 158.1 kB
  • Tags: CPython 3.4m, Windows x86
  • 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.2.1-cp34-cp34m-win32.whl
Algorithm Hash digest
SHA256 4bd8219ecb3a362d453aa4e8ea24ffc18d59009ce5de200cb0786348a6374248
MD5 c1c524450b9a030b06be67d6d0dc81c6
BLAKE2b-256 4f073a3bfddc76ad56b5a5770f239cc8ecba6961d6a59c0267fec4e1a0ddc29a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: hunter-2.2.1-cp34-cp34m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 817.3 kB
  • Tags: CPython 3.4m
  • 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.2.1-cp34-cp34m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 bfab3e6be38b8d916b63867e01d6696909834d092a97eb31809613bbabddcd22
MD5 7e8427c63f290e8299a223d790fdaaf6
BLAKE2b-256 44cc35e1852a9d26e613b38dee58992a730701dfca8d27b1c4569f380235cb10

See more details on using hashes here.

File details

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

File metadata

  • Download URL: hunter-2.2.1-cp27-cp27mu-manylinux1_x86_64.whl
  • Upload date:
  • Size: 720.8 kB
  • Tags: CPython 2.7mu
  • 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.2.1-cp27-cp27mu-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 0276f5cae4a3ef5a8aa777e0c28c994157eadba59742760ecda9de12e624241e
MD5 28c7e2b008fa5e1360a200b0649e216b
BLAKE2b-256 1ed0d9e33ee6779d8f99f8c86224e92b32e5c8e02b43b3264605e0575fbab6ee

See more details on using hashes here.

File details

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

File metadata

  • Download URL: hunter-2.2.1-cp27-cp27m-win_amd64.whl
  • Upload date:
  • Size: 186.2 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.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.2.1-cp27-cp27m-win_amd64.whl
Algorithm Hash digest
SHA256 dd0058dc73e838b7e986008e5af8ffa3028843b0bea583e1ff92056f3f0bf555
MD5 76b7b3719757b4c39162c9ce8c568306
BLAKE2b-256 a683b4da64e814cc18e89dd3f95785db52ea8fe104d07e227fdc0b8f9e3183d2

See more details on using hashes here.

File details

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

File metadata

  • Download URL: hunter-2.2.1-cp27-cp27m-win32.whl
  • Upload date:
  • Size: 155.9 kB
  • Tags: CPython 2.7m, Windows x86
  • 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.2.1-cp27-cp27m-win32.whl
Algorithm Hash digest
SHA256 35182ad2dc37d2e40e775a251c581f33d6d63b2b562d8c6c31cf1b403d76c3ef
MD5 59c6e35fcf1844f733a3ab7766b9a42a
BLAKE2b-256 9ad472a38d681128fd43a8cdc0cbb9eaeee723ae8b82949629fc9e5ad0ac050c

See more details on using hashes here.

File details

Details for the file hunter-2.2.1-cp27-cp27m-macosx_10_13_x86_64.whl.

File metadata

  • Download URL: hunter-2.2.1-cp27-cp27m-macosx_10_13_x86_64.whl
  • Upload date:
  • Size: 217.3 kB
  • Tags: CPython 2.7m, macOS 10.13+ x86-64
  • 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.2.1-cp27-cp27m-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 5b7d0ca2ecc03fe548028f3d8368fa2c6cba6465b27324a402aabbc1491e7765
MD5 33ed18b8930b7627b6afb02bec10e5c7
BLAKE2b-256 e2b0493f3499e0aa6646f5915cac18c0dce64fd6c2f1343ce6d2fbce5dde8c39

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

This release

2.2.1 This release

18 files

2.2.0.post1

1 file

2.2.0

18 files

2.1.0

22 files

2.0.2

23 files

2.0.1

23 files

2.0.0

23 files

1.4.1

14 files

1.4.0

8 files

1.3.0

14 files

1.2.2

7 files

1.2.1

7 files

1.2.0

7 files

1.1.0

7 files

1.0.2

7 files

1.0.1

7 files

1.0.0

1 file

0.6.0

2 files

0.5.1

2 files

0.5.0

2 files

0.4.0

2 files

0.3.1

2 files

0.3.0

2 files

0.2.1

2 files

0.2.0

2 files

0.1.0

2 files

0.0.1

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