Skip to main content

Logs all imported packages and their version

Project description

Build Status ReadTheDocs Coveralls PyPI-Server Downloads

Border-Patrol

Border-Patrol logs all imported packages and their version to support you while debugging. In 95% of all cases when something suddenly breaks in production it is due to some different version in one of your requirements. Pinning down the versions of all your dependencies and dependencies of dependencies inside a virtual environment helps you to overcome this problem but is quite cumbersome and thus this method is not always applied in practice. Also sometimes, like when you are using PySpark, you might not be 100% sure which library versions are installed on some cluster nodes.

With Border-Patrol you can easily find the culprit by looking in the logs of the last working version and compare it to the failing one since Border-Patrol will list all imported packages and their corresponding version right at the end of your application, even if it crashed.

Usage

Border-Patrol is really simple to use, just install it with pip install border-patrol and import it before any other package, e.g.:

from border_patrol import with_print_stdout

import pandas as pd

If you run those lines in a script, you will get a similar output to this one:

Python version is 3.6.7 |Anaconda, Inc.| (default, Oct 23 2018, 14:01:38)
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)]
Following packages were imported:
PACKAGE         VERSION   PATH
border_patrol   0.1       /Users/fwilhelm/Sources/border_patrol/src/border_patrol
cycler          0.10.0    /Users/fwilhelm/anaconda/envs/lib/python3.6/site-packages/cycler.py
dateutil        2.7.5     /Users/fwilhelm/anaconda/envs/lib/python3.6/site-packages/dateutil/__init__.py
matplotlib      2.2.3     /Users/fwilhelm/anaconda/envs/lib/python3.6/site-packages/matplotlib/__init__.py
numpy           1.15.1    /Users/fwilhelm/anaconda/envs/lib/python3.6/site-packages/numpy/__init__.py
pandas          0.23.4    /Users/fwilhelm/anaconda/envs/lib/python3.6/site-packages/pandas/__init__.py
pyparsing       2.3.0     /Users/fwilhelm/anaconda/envs/lib/python3.6/site-packages/pyparsing.py
pytz            2018.7    /Users/fwilhelm/anaconda/envs/lib/python3.6/site-packages/pytz/__init__.py
six             1.11.0    /Users/fwilhelm/anaconda/envs/lib/python3.6/site-packages/six.py

If you import with_print_stdout, Border-Patrol will use print as output function whereas with_print_stderr will print to standard error. Since most production applications will rather use the logging module, you can tell Border-Patrol to use it by importing with_log_{error|warning|info|debug}. For instance from border_patrol import with_log_info will log the final report by using the INFO logging level.

If you want even more fine grained control you can import the BorderPatrol class directly from the border_patrol package and use the register() and unregister() method to activate and deactivate it, respectively. At any point the tracking can be circumvented by using border_patrol.builtin_import.

How does it work?

Border-Patrol is actually quite simple. It overwrites the __import__ function in Python's builtins package to track every imported module. For each module the corresponding package is determined and the version number is retrieved with the help of the __version__ attribute which most professional libraries provide at the package level. If this fails the distribution name for the package is determined, e.g. scikit-learn is the distribution containing the sklearn package, with the help of pkg_resources which is a part of setuptools. Then the distribution name is used to determine the version number also using pkg_resources, similar to how pip would do it.

Finally, Border-Patrol registers an atexit handler to be called when your application finishes and reports all imported modules. To avoid any problem registering these things more than once, Border-Patrol is implemented as a singleton and thus it is not thread-safe.

Note

This project has been set up using PyScaffold 3.1. For details and usage information on PyScaffold see https://pyscaffold.org/.

Project details


Download files

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

Source Distribution

border-patrol-0.0.0.tar.gz (6.4 kB view details)

Uploaded Source

Built Distribution

border_patrol-0.0.0-py2.py3-none-any.whl (8.7 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file border-patrol-0.0.0.tar.gz.

File metadata

  • Download URL: border-patrol-0.0.0.tar.gz
  • Upload date:
  • Size: 6.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.0.0 requests-toolbelt/0.9.1 tqdm/4.55.1 CPython/3.7.9

File hashes

Hashes for border-patrol-0.0.0.tar.gz
Algorithm Hash digest
SHA256 146e970e22d3215fb809510002ff351a67e483549f3faf2825194b8d778bda92
MD5 0d621c8521541dd09aaa7a0f334bf586
BLAKE2b-256 3ea23e1fd11f433c57dfac246ab1f104aacb6d4564d365bf5e7d06526e0b9cd3

See more details on using hashes here.

File details

Details for the file border_patrol-0.0.0-py2.py3-none-any.whl.

File metadata

  • Download URL: border_patrol-0.0.0-py2.py3-none-any.whl
  • Upload date:
  • Size: 8.7 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.0.0 requests-toolbelt/0.9.1 tqdm/4.55.1 CPython/3.7.9

File hashes

Hashes for border_patrol-0.0.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 004557736dca70b07b7c62e0ee0505f23a83b94a814e31587cc815d2d760efff
MD5 4a9c07e20ca9839a5c071dc46f065931
BLAKE2b-256 8ba975c6f504c64b15a7a0d3f52f6ecb0dc6e54a535a93a6a6b9a7a3a06c5315

See more details on using hashes here.

Supported by

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