记录所有导入的包及其版本
项目描述
Border-Patrol
Border-Patrol记录所有导入的包及其版本,以支持您在调试时的需要。在所有情况中有95%当生产中出现问题时,是由于要求中某个不同版本。在虚拟环境中固定所有依赖和依赖项的版本可以帮助您克服这个问题,但这相当繁琐,因此在实践中这种方法并不总是应用。此外,有时,比如当您使用PySpark时,您可能并不完全确定某些集群节点上安装了哪些库版本。
使用Border-Patrol,您可以通过查看最后一个正常版本和失败版本的日志来轻松找到罪魁祸首。Border-Patrol将在应用程序末尾列出所有导入的包及其对应版本,即使应用程序崩溃也是如此。
用法
Border-Patrol使用非常简单,只需使用pip install border-patrol
进行安装,并在导入任何其他包之前导入它,例如:
from border_patrol import with_print_stdout
import pandas as pd
如果您在脚本中运行这些行,您将得到类似于以下输出的结果:
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
如果您导入with_print_stdout
,Border-Patrol将使用print
作为输出函数,而with_print_stderr
将输出到标准错误。由于大多数生产应用程序更可能使用logging
模块,您可以通过导入with_log_{error|warning|info|debug}
来告诉Border-Patrol使用它。例如,from border_patrol import with_log_info
将使用INFO
日志级别记录最终报告。
如果您希望有更细粒度的控制,可以直接从border_patrol
包中导入BorderPatrol
类,并使用register()
和unregister()
方法分别激活和停用它。在任何时候,都可以使用border_patrol.builtin_import
来绕过跟踪。
它是如何工作的?
Border-Patrol实际上非常简单。它覆盖了Python的builtins
包中的__import__
函数来跟踪每个导入的模块。对于每个模块,都会确定相应的包,并使用大多数专业库在包级别提供的__version__
属性来检索版本号。如果失败,将使用pkg_resources
(它是setuptools
的一部分)来确定包的发行名称,例如,scikit-learn
是包含sklearn
包的发行版。然后使用pkg_resources
来确定版本号,类似于pip
的方式。
最后,Border-Patrol注册了一个atexit
处理程序,在您的应用程序完成后调用,并报告所有导入的模块。为了避免注册这些内容多次而引起的问题,Border-Patrol实现为单例,因此它不是线程安全的。
注意
该项目使用PyScaffold 3.1进行设置。有关PyScaffold的详细信息和使用信息,请参阅https://pyscaffold.org/。