Matplotlib 的 show 函数会触发不需要的输出。

11
每当我在Visual Studio Code v1.74.2中使用Python v3.10.4执行任何Python代码(无论是否进行调试),除了代码的正常输出之外,我还会在Debug Console窗口中看到以下类似的输出。否则,在此期间,我的所有Python程序都能够正确地工作和达到预期效果。
1   HIToolbox                           0x00007ff81116c0c2 _ZN15MenuBarInstance22RemoveAutoShowObserverEv + 30
2   HIToolbox                           0x00007ff8111837e3 SetMenuBarObscured + 115
3   HIToolbox                           0x00007ff81118a29e _ZN13HIApplication11FrontUILostEv + 34
4   HIToolbox                           0x00007ff811183622 _ZN13HIApplication15HandleActivatedEP14OpaqueEventRefhP15OpaqueWindowPtrh + 508
5   HIToolbox                           0x00007ff81117d950 _ZN13HIApplication13EventObserverEjP14OpaqueEventRefPv + 182
6   HIToolbox                           0x00007ff811145bd2 _NotifyEventLoopObservers + 153
7   HIToolbox                           0x00007ff81117d3e6 AcquireEventFromQueue + 494
8   HIToolbox                           0x00007ff81116c5a4 ReceiveNextEventCommon + 725
9   HIToolbox                           0x00007ff81116c2b3 _BlockUntilNextEventMatchingListInModeWithFilter + 70
10  AppKit                              0x00007ff80a973f33 _DPSNextEvent + 909
11  AppKit                              0x00007ff80a972db4 -[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 1219
12  AppKit                              0x00007ff80a9653f7 -[NSApplication run] + 586
13  _macosx.cpython-310-darwin.so       0x0000000110407e22 show + 162
14  Python                              0x0000000100bb7595 cfunction_vectorcall_NOARGS + 101
15  Python                              0x0000000100c9101f call_function + 175
16  Python                              0x0000000100c8a2c4 _PyEval_EvalFrameDefault + 34676
17  Python                              0x0000000100c801df _PyEval_Vector + 383
18  Python                              0x0000000100c9101f call_function + 175
19  Python                              0x0000000100c8a2c4 _PyEval_EvalFrameDefault + 34676
20  Python                              0x0000000100c801df _PyEval_Vector + 383
21  Python                              0x0000000100b53f61 method_vectorcall + 481
22  Python                              0x0000000100c8a4f2 _PyEval_EvalFrameDefault + 35234
23  Python                              0x0000000100c801df _PyEval_Vector + 383
24  Python                              0x0000000100c9101f call_function + 175
25  Python                              0x0000000100c8a2c4 _PyEval_EvalFrameDefault + 34676
26  Python                              0x0000000100c801df _PyEval_Vector + 383
27  Python                              0x0000000100cf536d pyrun_file + 333
28  Python                              0x0000000100cf4b2d _PyRun_SimpleFileObject + 365
29  Python                              0x0000000100cf417f _PyRun_AnyFileObject + 143
30  Python                              0x0000000100d20047 pymain_run_file_obj + 199
31  Python                              0x0000000100d1f815 pymain_run_file + 85
32  Python                              0x0000000100d1ef9e pymain_run_python + 334
33  Python                              0x0000000100d1ee07 Py_RunMain + 23
34  Python                              0x0000000100d201e2 pymain_main + 50
35  Python                              0x0000000100d2048a Py_BytesMain + 42
36  dyld                                0x00007ff80741b310 start + 2432
  1. 为什么这些行会出现在调试控制台窗口中,尽管我所知道的我的Python程序中没有任何直接导致它们出现的内容?
  2. 它们如何有用,如果需要,如何使用它们?
  3. 如何防止它们默认出现?

我查看了Python调试的Visual Studio Code文档,但没有找到任何可以解释这些行的内容。我正在macOS Ventura v13.1上运行Visual Studio Code。


截至2023年1月2日的更新

我已经发现,在我的Python程序中,matplotlib.pyplot.show函数会触发初始帖子中不想要的输出。即使运行以下如此简单的程序,我仍然会得到该输出:

import matplotlib.pyplot as plt

x = [1, 2, 3]
y = [1, 2, 3]
plt.plot(x, y)

plt.show()

当我从上面的代码中删除plt.show()时,36行不需要的输出就不会出现,但是图形也不会显示。除了不需要的输出之外,所有使用show函数的Python程序似乎都能正常工作,包括由show函数触发的图形显示。我在我的Mac上安装了Matplotlib 3.5.2。
如果我直接通过命令行运行相同的程序(假设Python程序的名称为test.py),则会出现非常相似的不需要的输出:
python3 test.py

但当我通过IDLE(Python的集成开发和学习环境)或Jupyter笔记本中的代码运行test.py时,就不会出现这种情况。
我可以从我的Python程序中删除show函数以避免不需要的输出,但那样图表就不会显示出来了,我更喜欢使用show函数而不是临时的解决方案。

截至2023年1月4日更新

在Matplotlib论坛上,有人建议这可能是macOS Ventura v13.1的问题,因为最近开始有不同程序在macOS Ventura v13.1下执行时报告类似的问题。一位用户报告了使用Tkinter代码时遇到类似输出的问题,另一位用户则在使用名为mpv的视频播放器时遇到了类似问题

虽然问题与macOS Ventura v13.1有关也不是不可能,但我不知道具体原因,我的问题仍然存在。


截至2023年1月6日更新

已将Matplotlib升级到v3.6.2,但仍未解决非预期输出问题。


截至2023年1月8日更新

尝试使用Python v3.11.1和Matplotlib v3.6.2,但仍存在不必要的输出问题。


截至2023年1月15日更新

已将此问题报告为Matplotlib开发人员在GitHub上的错误:“[Bug]: Show function triggering unwanted additional output #24997


截至2023年1月16日更新

我发现只有在系统设置->桌面&Dock->菜单栏下的“自动隐藏和显示菜单栏”选项设置为始终(这是我的设置)或仅在桌面上时,才会出现不需要的输出。如果我将该选项设置为仅在全屏模式下从不,则不会出现不需要的输出。


截至2023年1月18日更新

Matplotlib和Python开发人员在GitHub上都认为,他们可以重现的不必要输出是macOS Ventura 13.1中的一个错误,因此他们无法做任何事情。

有关详细信息,请参阅我在GitHub上提交的Matplotlib的错误报告后面的相应讨论,以及我稍后通过Python/CPython在GitHub上提交的Tkinter的错误报告,链接为“Tkinter causing unwanted output in most recent macOS”。对于后者的回复也告诉我,已经向Apple提交了有关已确定的错误的反馈助手报告。


截至2023年1月25日更新

今天我将我的Mac升级到了Ventura 13.2(并在2月中旬进一步升级到了Ventura 13.2.1)。除了运行小程序时不需要的输出现在变得更长(85行)之外,没有任何变化。与以前一样,程序正常工作,如果我更改我的Mac菜单栏设置为从不,则不会出现不需要的输出。


2
这些被小型Mac应用程序发现并显示在绘图窗口中。您必须打开一些Xcode设置才能实现此功能。 - Jody Klymak
这个示例代码对我来说没有任何问题。您有其他设置吗?请展示您的界面和 settings.json 文件。 - JialeDu
感谢提供的信息。如果您使用Anaconda发行版中提供的Python,例如,问题仍然存在吗?请参阅Python分发列表。我的意见是,您想要了解Python和MacOs之间通信缺陷是基于Python/Numpy/Matplotlib源代码还是与构建二进制文件时使用的特定工具链有关的问题。 - gboffi
1
我在 macOS Ventura 和 M1 MacBook Pro 上的 vscode 中以及 ipython 控制台中使用 Anaconda Python (3.9.13 和 3.10.8) 遇到了同样的问题。 - jolvi
2
如果我没记错的话,我在 Ventura 13.0(出厂安装版)时没有遇到这个问题,只有在升级到 Ventura 13.1 后才出现。 - jolvi
显示剩余8条评论
3个回答

6

经过一番查找,似乎与苹果菜单栏(即顶部栏)有关。

" 解决方案 "

在你的 Mac 设置中,将"自动隐藏和显示菜单栏"设置为从不以避免出现这些堆栈跟踪日志。

> 存在问题:

Mac 设置,“自动隐藏和显示菜单栏”

> 问题不存在:

Mac 设置,值设为“从不”

结论

我知道这并不是一个解决方案,但在 Apple 修复导致这种情况的 HIToolbox 框架问题之前,你可以采取这种方法来避免被不需要的堆栈跟踪污染。


我最近也刚刚弄清楚了这一点,并计划更新我的问题以反映这个观察结果。我知道“HIToolbox”是不必要输出中重复关键字之一,但您是如何确定它是需要修复的根本问题(由Apple解决)的?是否有可能Apple最近对该框架或macOS的其他部分进行了一些更改,而某些程序或库(如Matplotlib或Tkinter)未按照必要的方式进行更新? - Alper

1

这个问题似乎是由 macOS 13.1 和 13.2 中的一个或多个错误引起的。只有通过将 macOS 降级到 13.0 或更早版本,或升级到 13.3 或更高版本才能完全解决它。


0

[解决方法]

如果您使用matplotlib的plt.show()在CLI中运行Python代码,则以下内容将重定向您(和我)正在查看的控制台/ stderr输出。

  • 将其重定向到文件以进行检查:python plot_trajectory_3d.py 2>stderr.txt
  • 将其重定向到无处: python plot_trajectory_3d.py 2>/dev/null

您可能还可以通过此附加重定向语句使您使用的IDE运行Python。

有关这些SO问题中的重定向的更多信息。

显而易见的是:import matplotlib.pyplot as plt

供参考,我正在使用macOS和这些软件包版本:

- python      3.10.9
- matplotlib  3.7.0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接