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

时间:2018-04-07 21:02:36

标签: python import kivy python-internals

当我在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安装它,但实际上我不知道这里发生了什么。

1 个答案:

答案 0 :(得分:3)

输出由kivy.logger module生成,Python logger module只使用标准{{3}}。

除非设置了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)在首次使用时运行额外的代码,并在Logger.info('Logger: Record log in %s' % filename)消息之前插入Kivy: v<version>处理。最后,kivy/__init__.py执行Logger.info('Python: v{}'.format(sys.version))以输出Python版本信息。