为什么在 python 中导入 kivy 时会打印信息行?

Why do the info lines get printed when importing kivy in python?

当我在 python 中导入 kivy 时:

>>> import kivy

打印了以下三个调试行:

[INFO   ] [Logger      ] Record Log in C:\Users\usrname\.kivy\logs\kivy_18-04-07_50.txt
[INFO   ] [Kivy        ] v1.10.0
[INFO   ] [Python      ] v3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)]

我知道这不是错误,而是有意为之,但我想抑制此输出。我已阅读文件 kivy\__init__.py 并发现在执行以下行时会打印这些行:

from kivy.compat import PY2

所以我也阅读了 kivy\compat.py,它甚至不是一个大文件(102 行),但我仍然不明白为什么要打印调试行。

我已经在python控制台中执行了文件的每一行(包括文档字符串和注释),但无法重现它。

有人可以给我解释一下吗?我认为这是内部的东西,只有因为我用 pip 安装它才有可能,但实际上我不知道这里发生了什么。

输出由kivy.logger module, which simply uses the standard Python logger module生成。

模块添加一个记录器输出到控制台,除非设置了KIVY_NO_CONSOLELOG环境变量:

if 'KIVY_NO_CONSOLELOG' not in os.environ:
    # ...
    formatter = ColoredFormatter(color_fmt, use_color=use_color)
    console = ConsoleHandler()
    console.setFormatter(formatter)
    Logger.addHandler(console)

从那时起,记录的消息将打印到您的控制台。

触发这一切的不是kivy.compat模块;在包中导入模块时,Python 将始终确保首先加载包本身。因此 import kivy.compat 将触发 kivy 自身的导入(如果尚未加载)。

输出第一条日志信息的是kivy/__init__.py:

if RELEASE:
    Logger.info('Kivy: v%s' % (__version__))

但是同样配置的 kivy.logger.FileHandler 对象(除非在环境中设置了 KIVY_NO_FILELOG)在首次使用时运行额外的代码并在 Kivy: v<version> 之前插入 Logger.info('Logger: Record log in %s' % filename)消息被处理。最后,kivy/__init__.py执行Logger.info('Python: v{}'.format(sys.version))输出Python版本信息。