记录所有导入的包及其版本
border-patrol的Python项目详细描述
边境巡逻
Border Patrol会记录所有导入的包及其版本,以便在调试时为您提供支持。在95%的情况下 有些东西在生产中突然中断—这是由于您的某个需求中的某个不同版本造成的。固定 虚拟环境中所有依赖项和依赖项的版本有助于您克服 但这个问题相当麻烦,因此这种方法并不总是在实践中应用。有时,比如 您正在使用pyspark,可能无法100%确定某些群集节点上安装了哪些库版本。
有了边境巡逻队,你可以通过查看上一个工作版本的日志并进行比较,很容易找到罪犯 因为边境巡逻队会在 应用程序结束,即使它崩溃。
用法
Border Patrol的使用非常简单,只需使用pip install border-patrol
安装即可。
并在任何其他包之前导入,例如:
fromborder_patrolimportwith_print_stdoutimportpandasaspd
如果在脚本中运行这些行,将得到与此类似的输出:
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 PATHborder_patrol 0.1 /Users/fwilhelm/Sources/border_patrol/src/border_patrolcycler 0.10.0 /Users/fwilhelm/anaconda/envs/lib/python3.6/site-packages/cycler.pydateutil 2.7.5 /Users/fwilhelm/anaconda/envs/lib/python3.6/site-packages/dateutil/__init__.pymatplotlib 2.2.3 /Users/fwilhelm/anaconda/envs/lib/python3.6/site-packages/matplotlib/__init__.pynumpy 1.15.1 /Users/fwilhelm/anaconda/envs/lib/python3.6/site-packages/numpy/__init__.pypandas 0.23.4 /Users/fwilhelm/anaconda/envs/lib/python3.6/site-packages/pandas/__init__.pypyparsing 2.3.0 /Users/fwilhelm/anaconda/envs/lib/python3.6/site-packages/pyparsing.pypytz 2018.7 /Users/fwilhelm/anaconda/envs/lib/python3.6/site-packages/pytz/__init__.pysix 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}
来使用边界巡逻。
例如,from border_patrol import with_log_info
将使用INFO
日志级别记录最终报告。
如果需要更细粒度的控制,可以直接从border_patrol
包导入BorderPatrol
类
使用register()
和unregister()
方法分别激活和停用它。在任何时候
使用border_patrol.builtin_import
可以避开跟踪。
它是如何工作的?
边境巡逻其实很简单。它覆盖python的builtins
包中的__import__
函数以跟踪
每个导入的模块。对于每个模块,将确定相应的包,并使用
大多数专业库在包级别提供的__version__
属性的帮助。如果失败了
确定包的分发名称,例如scikit-learn
是包含sklearn
包的分发,
借助于pkg_resources
,它是setuptools
的一部分。然后使用分发名称来确定
版本号也使用pkg_resources
,类似于pip
的方式。
最后,border patrol注册了一个atexit
处理程序,在应用程序完成并
报告所有导入的模块。为了避免多次登记这些东西时出现任何问题,边境巡逻队实施了
作为单例,因此它是not线程安全的。
注
此项目是使用Pyscaffold 3.1设置的。有关pyscaffold的详细信息和用法信息,请参见https://pyscaffold.org/。