Django - 安装 matplotlib 后使用迁移管理命令时出现奇怪的调试输出

Django - weird debug output when using migrations management commands after installing matplotlib

运行 Docker 容器中的 GeoDjango - 在 Docker 文件中通过 pip 添加了额外的库,现在每当我调用任何迁移命令时都会遇到不需要的控制台输出,例如manage.py showmigrations/makemigrations/migrate.

输出结果如下:

user@host:/src$ ./manage.py showmigrations
CONFIGDIR=/home/django/.config/matplotlib
(private) matplotlib data path: /usr/local/lib/python3.7/site-packages/matplotlib/mpl-data
matplotlib data path: /usr/local/lib/python3.7/site-packages/matplotlib/mpl-data
loaded rc file /usr/local/lib/python3.7/site-packages/matplotlib/mpl-data/matplotlibrc
matplotlib version 3.2.1
interactive is False
platform is linux
loaded modules: ['sys', 'builtins', '_frozen_importlib', '_imp', '_thread', '_warnings', '_weakref', 'zipimport', '_frozen_importlib_external', '_io', 'marshal', 'posix', 'encodings', 'codecs', '_codecs', ...

综合模块列表被截断,继续:

Using fontManager instance from /home/django/.cache/matplotlib/fontlist-v310.json
Loaded backend qt5agg version unknown.
Loaded backend tkagg version unknown.
Loaded backend agg version unknown.
Loaded backend agg version unknown.
Found GEOS DLL: <CDLL '/usr/local/lib/python3.7/site-packages/shapely/.libs/libgeos_c-5031f9ac.so.1.13.1', handle 5608f64e4c40 at 0x7f22a5aaaf10>, using it.
Trying `CDLL(libc.so.6)`
Library path: 'libc.so.6'
DLL: <CDLL 'libc.so.6', handle 7f22c4809000 at 0x7f22aef3b650>
GDAL_DATA not found in environment, set to '/usr/local/lib/python3.7/site-packages/fiona/gdal_data'.
PROJ data files are available at built-in paths
Entering env context: <fiona.env.Env object at 0x7f22a0798450>
Starting outermost env
No GDAL environment exists
New GDAL environment <fiona._env.GDALEnv object at 0x7f22a0798490> created
Logging error handler pushed.
All drivers registered.
GDAL_DATA found in environment: '/usr/local/lib/python3.7/site-packages/fiona/gdal_data'.
PROJ data files are available at built-in paths
Started GDALEnv <fiona._env.GDALEnv object at 0x7f22a0798490>.
Updated existing <fiona._env.GDALEnv object at 0x7f22a0798490> with options {}
Entered env context: <fiona.env.Env object at 0x7f22a0798450>
Exiting env context: <fiona.env.Env object at 0x7f22a0798450>
Cleared existing <fiona._env.GDALEnv object at 0x7f22a0798490> options
Stopping GDALEnv <fiona._env.GDALEnv object at 0x7f22a0798490>.
Error handler popped.
Stopped GDALEnv <fiona._env.GDALEnv object at 0x7f22a0798490>.
Exiting outermost env
Exited env context: <fiona.env.Env object at 0x7f22a0798450>
Could not import boto3, continuing with reduced functionality.
PROJ data files are available at built-in paths

最后显示正常的迁移输出:

admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
[snipped ...]
user@host:/src$

它在带有 gunicorn 的生产系统上,而不是 运行 在 DEBUG 模式下。在开发系统上,设置了相同的库,但在 DEBUG 模式下,输出是正常的。开发和生产 dockerfiles 几乎相同,源于 python:3.7.4-buster.

乍一看,它看起来像一个 "chatty" 库,它在加载时打印所有内容?不确定是否有东西坏了或者这是否正常? gunicorn 错误日志中没有任何问题迹象。这似乎也只影响迁移命令,没有其他 manage.py 命令。

感谢任何提示!

查看 source for Fiona 我们发现

log.debug("Entering env context: %r", self)

由于这是 debug 级别的消息,默认情况下它是不可见的。 这是日志记录已配置为记录调试级别消息的线索。

这可以通过您的 Django 配置(在后台使用 logging.dictConfig())或通过例如一些模块有 运行 logging.basicConfig(level=logging.DEBUG).

另外,考虑到一些包用来将自己连接到您的导入路径的 .pth 文件是如何工作的(它们只是 Python),这可能会无意中发生 即使包本身未导入

我建议您一个一个地删除其中的一些包,直到您发现哪个包引起了额外的闲聊。