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 Python API, terminal activation (see Environment variable activation). and supports tracing other processes (see Tracing processes).

  • Free software: BSD license

Installation

pip install hunter

Documentation

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

Overview

The default action is to just print the code being executed. Example:

import hunter
hunter.trace(module='posixpath')

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

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

Custom actions

The tracer allow custom actions like CallPrinter or VarsPrinter.

With CallPrinter (added in hunter 1.2.0, will be the default action in 2.0.0):

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

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

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

With VarsPrinter:

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

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

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="".

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

Uploaded Source

Built Distributions

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

hunter-2.0.0-cp36-cp36m-win_amd64.whl (400.0 kB view details)

Uploaded CPython 3.6mWindows x86-64

hunter-2.0.0-cp36-cp36m-win32.whl (371.8 kB view details)

Uploaded CPython 3.6mWindows x86

hunter-2.0.0-cp36-cp36m-manylinux1_x86_64.whl (955.6 kB view details)

Uploaded CPython 3.6m

hunter-2.0.0-cp36-cp36m-manylinux1_i686.whl (900.4 kB view details)

Uploaded CPython 3.6m

hunter-2.0.0-cp35-cp35m-win_amd64.whl (397.9 kB view details)

Uploaded CPython 3.5mWindows x86-64

hunter-2.0.0-cp35-cp35m-win32.whl (369.9 kB view details)

Uploaded CPython 3.5mWindows x86

hunter-2.0.0-cp35-cp35m-manylinux1_x86_64.whl (936.4 kB view details)

Uploaded CPython 3.5m

hunter-2.0.0-cp35-cp35m-manylinux1_i686.whl (874.8 kB view details)

Uploaded CPython 3.5m

hunter-2.0.0-cp34-cp34m-win_amd64.whl (392.1 kB view details)

Uploaded CPython 3.4mWindows x86-64

hunter-2.0.0-cp34-cp34m-win32.whl (370.2 kB view details)

Uploaded CPython 3.4mWindows x86

hunter-2.0.0-cp34-cp34m-manylinux1_x86_64.whl (966.3 kB view details)

Uploaded CPython 3.4m

hunter-2.0.0-cp34-cp34m-manylinux1_i686.whl (901.1 kB view details)

Uploaded CPython 3.4m

hunter-2.0.0-cp33-cp33m-win_amd64.whl (392.5 kB view details)

Uploaded CPython 3.3mWindows x86-64

hunter-2.0.0-cp33-cp33m-win32.whl (370.5 kB view details)

Uploaded CPython 3.3mWindows x86

hunter-2.0.0-cp33-cp33m-manylinux1_x86_64.whl (900.9 kB view details)

Uploaded CPython 3.3m

hunter-2.0.0-cp33-cp33m-manylinux1_i686.whl (837.6 kB view details)

Uploaded CPython 3.3m

hunter-2.0.0-cp27-cp27mu-manylinux1_x86_64.whl (859.5 kB view details)

Uploaded CPython 2.7mu

hunter-2.0.0-cp27-cp27mu-manylinux1_i686.whl (796.5 kB view details)

Uploaded CPython 2.7mu

hunter-2.0.0-cp27-cp27m-win_amd64.whl (398.2 kB view details)

Uploaded CPython 2.7mWindows x86-64

hunter-2.0.0-cp27-cp27m-win32.whl (369.6 kB view details)

Uploaded CPython 2.7mWindows x86

hunter-2.0.0-cp27-cp27m-manylinux1_x86_64.whl (859.5 kB view details)

Uploaded CPython 2.7m

hunter-2.0.0-cp27-cp27m-manylinux1_i686.whl (796.6 kB view details)

Uploaded CPython 2.7m

File details

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

File metadata

  • Download URL: hunter-2.0.0.tar.gz
  • Upload date:
  • Size: 396.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for hunter-2.0.0.tar.gz
Algorithm Hash digest
SHA256 7f9d491da52bad12f02dd15f48cfbd5138be6511146fb73502ed142861c1e207
MD5 9231929c9fe1a856fc3a25c79e35d2a2
BLAKE2b-256 a79e0b5f4b46081db29f6c323a770a0c4ce8e2dd4652fa0958a9d13d118d5793

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for hunter-2.0.0-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 efd5f753095ffaa78780572c67e450c18d11e89945caa1bc00862881b600bcc2
MD5 b72e9948bf1a6f2809d0ce0ef85140ee
BLAKE2b-256 c9f69fc00906bc23385c18c1be1db58f6809f6bbbadcfd4e335986fb9bf0b28c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for hunter-2.0.0-cp36-cp36m-win32.whl
Algorithm Hash digest
SHA256 edd8d0af907d45e48befe5cb1b096471f9815d2d283224a06fd4847876ba4bd7
MD5 3b1f12daccd8d649f56f98bd148a276d
BLAKE2b-256 005dde874e8ee65e10a1d3e0525551272c0794d20fa05874a0271284f7c47d75

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for hunter-2.0.0-cp36-cp36m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 2f87fe5dcba0d1cc876bcba95a597c28d5c68ed1670991f437f2969af2af1e33
MD5 0601777d0009a5c3f18689470e1e229b
BLAKE2b-256 c52a21841f34f4e51a9dbbdcc3ecad117cdc654e52430c6bd9a33518ec9c6d40

See more details on using hashes here.

File details

Details for the file hunter-2.0.0-cp36-cp36m-manylinux1_i686.whl.

File metadata

File hashes

Hashes for hunter-2.0.0-cp36-cp36m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 1fd22b8abec8aa7c31dc2a5fe76fc004135027f25c54efb3f95582f7b6e0265d
MD5 be7fc5ba1cf69185e9b6d2adf8f5ee00
BLAKE2b-256 1430b0e523030ff4bfeacbba002cdff8b356d1229228a7445b253d3bf6693007

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for hunter-2.0.0-cp35-cp35m-win_amd64.whl
Algorithm Hash digest
SHA256 2a2fe29a5397a65ff83a56b4e8b242991ed9d8fb89eee980be5422d045ca2b3d
MD5 78c9325a71aff739fcb0ccfd584a22d6
BLAKE2b-256 12a2f87501c2217bc756d822d0c09e8178501a2c54377e5226f50eed4ceb0eb8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for hunter-2.0.0-cp35-cp35m-win32.whl
Algorithm Hash digest
SHA256 b741c612cfbdee369b49939431acb6b7b24e041ce0d7f7479c202a61f7637966
MD5 4f0bd0212f71a393798d444ddffdc6cf
BLAKE2b-256 07ba3f1e8adf2791f01cc98d5dabf6a95a1909b98f3d3482c1191e7a6670a147

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for hunter-2.0.0-cp35-cp35m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 da4a0e9c2570b3e109d486443933141b1a6aba0c760fcc027ee38c05fbe847df
MD5 8af468dbc3d626b4971341fa07f019af
BLAKE2b-256 1a8786a6d433a7c63ed456fe3291648b2f1635d854311a7a37e805c3f77dbe86

See more details on using hashes here.

File details

Details for the file hunter-2.0.0-cp35-cp35m-manylinux1_i686.whl.

File metadata

File hashes

Hashes for hunter-2.0.0-cp35-cp35m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 cc73685e3df728dcc41cf4b1ddac26e68d9656c6e69dee25fcf96d0ec188db9e
MD5 5d8371684f35dd7472bbd10444ed58d2
BLAKE2b-256 b94babef686391c91519d422a9757eda5f4b997b3e2898c6cf4de19e7bd63bf9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for hunter-2.0.0-cp34-cp34m-win_amd64.whl
Algorithm Hash digest
SHA256 fd28813eca1ffecc325327ed6fd0da2c10564c4c59c49e9b0f756b7ed7a81b61
MD5 b8f8ea0fe77ec7e74937bafb50c188bb
BLAKE2b-256 d09095605c189b39e02fd3c27fa6b3ca8c970c3731b608e1d7d3f9a0df656e2e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for hunter-2.0.0-cp34-cp34m-win32.whl
Algorithm Hash digest
SHA256 6a6c20bde59da42b8efe21f8f7ca40a47d1afd03003f10803330dd64567ea5e4
MD5 8e8e7b7fd7932d5299080a7af358f403
BLAKE2b-256 6a87bf9e5164347181255327c206913dd7ff2f9b3af64c21d0a538b70183a092

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for hunter-2.0.0-cp34-cp34m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 15761efe87e72027669fa69bd19e5b1c0641868cb23d4523b9a7578530b002ef
MD5 218edca62d611d519355ee3da862a26c
BLAKE2b-256 a05cd957cefa70b89baaad2cef41b731f43dd2076aeab726ef21fb2d86bcde1e

See more details on using hashes here.

File details

Details for the file hunter-2.0.0-cp34-cp34m-manylinux1_i686.whl.

File metadata

File hashes

Hashes for hunter-2.0.0-cp34-cp34m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 9930af5216b06e3bf3310e013d93b0eae9f0ecf7acaee54ef7dc10616e8e5a04
MD5 fb666e4d294e862ae41f3fe787ac3701
BLAKE2b-256 f254a25d997f527b8682baa4a9e9afb986c31ece6ad705cbf2f8ee19e1cd8f1e

See more details on using hashes here.

File details

Details for the file hunter-2.0.0-cp33-cp33m-win_amd64.whl.

File metadata

File hashes

Hashes for hunter-2.0.0-cp33-cp33m-win_amd64.whl
Algorithm Hash digest
SHA256 fbbfe1b1eaa194d8e8eabfd8064acab7d28f05597ed5bd02b58d7df5b960873e
MD5 afb1ffc2bbd29eed40251183c964da5e
BLAKE2b-256 516ecb9480b4b67fb33fe7f94874fc5a267f73c887f838d79ed40694e061e8f1

See more details on using hashes here.

File details

Details for the file hunter-2.0.0-cp33-cp33m-win32.whl.

File metadata

File hashes

Hashes for hunter-2.0.0-cp33-cp33m-win32.whl
Algorithm Hash digest
SHA256 e0ba0ecad9b13384f9043515df376b872224d8f47ff14a97be2faa8061f25f6a
MD5 a29f6cea2d263375c01ee40d5a432ba7
BLAKE2b-256 22bf08020d9f6b3ab5e87fa3030c3a10b645b00c5e777024ff474e4f7f5907be

See more details on using hashes here.

File details

Details for the file hunter-2.0.0-cp33-cp33m-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for hunter-2.0.0-cp33-cp33m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 e889037b7541d312b10d440b9a58bf5fd6b31bd03094c72b284e5d1e9d999eb6
MD5 13eec0cf9cc10f420c836ecce8c9562e
BLAKE2b-256 ef86fbdd4aa1e1b111a793413cff521319d3310ff377c4b330fd1a37f32830e5

See more details on using hashes here.

File details

Details for the file hunter-2.0.0-cp33-cp33m-manylinux1_i686.whl.

File metadata

File hashes

Hashes for hunter-2.0.0-cp33-cp33m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 447517101c15fe4644dfdc5d3c1a52cf68f4f86addf6c0a37e0252b956a80d44
MD5 2c5962b28cb87e9170766e8210c8417b
BLAKE2b-256 e1009a1b0f8c0fbfab18f83e793e05523ad261b29de9107af72719b550ee6f10

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for hunter-2.0.0-cp27-cp27mu-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 e41f3f3e261116b2d07b7f50d2274b505301ed13321eafc79015b1a39dd1679c
MD5 ef784b81342cc8eaec5e21b9747ea5f7
BLAKE2b-256 73b68bc239c81191c3c2a647e2279fe2064d17b9a247cfe86a7c39d34d0db69e

See more details on using hashes here.

File details

Details for the file hunter-2.0.0-cp27-cp27mu-manylinux1_i686.whl.

File metadata

File hashes

Hashes for hunter-2.0.0-cp27-cp27mu-manylinux1_i686.whl
Algorithm Hash digest
SHA256 7ae48ab555ba94435d6d9035e2fbe6a78e7ec220d71ab59b6b05508e7efe1720
MD5 5b1430e8b100d0d576cccfffd39a3121
BLAKE2b-256 3ad06b94715d58c349ab84e46291f069b925720e81c9fc5395ada92e92f335d9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for hunter-2.0.0-cp27-cp27m-win_amd64.whl
Algorithm Hash digest
SHA256 4b0c36fe6bee66c431e427182ead08e35c129f363d6f25ed8076d84f5705cce5
MD5 b1c81bd0258affff15efb18dbd0bf4bf
BLAKE2b-256 dd31b3c78f07025d76bc4ccd626d4a3add4d550cdbad1de168a32e664719f7bf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for hunter-2.0.0-cp27-cp27m-win32.whl
Algorithm Hash digest
SHA256 b2dd822acda2229f7fdd9793438f4caba8d45dc63bf955926ffb52432b6791f8
MD5 16aa17b586bfdbbed983e7a7ae8ed29a
BLAKE2b-256 5d0be11945e52b14730f392fe43de300a42863e26b38a5772559539ee45ed347

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for hunter-2.0.0-cp27-cp27m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 0e8580d1126acee5c6875e30ab64d5470c68d118dfece3c9153d611f3fb8934c
MD5 c321bf9297c3dfd60a23690f42c37ea6
BLAKE2b-256 09f7ef58095a170999aa9334a0f8e3da5cf0b554322a6d38981525f0c0f8d9c6

See more details on using hashes here.

File details

Details for the file hunter-2.0.0-cp27-cp27m-manylinux1_i686.whl.

File metadata

File hashes

Hashes for hunter-2.0.0-cp27-cp27m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 7127e34b4325ac08e2c88169c4deebecbcaf37a7cc06c05a4e3b779a6aefc1a0
MD5 2e4fe5162794c789ba65cecf7f28ae7a
BLAKE2b-256 45316a592af11355b067649bdf204c4d31eb543f7f1cf6c61ee6fcc079d893fa

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

2.1.0

22 files

2.0.2

23 files

2.0.1

23 files

This release

2.0.0 This release

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