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

Alp*_*per 11 python macos matplotlib visual-studio-code vscode-debugger

每当我通过 Python v3.10.4 执行任何 Python 代码(无论是否在 Visual Studio Code v1.74.2 中进行调试)时,除了代码的正常输出之外,我还会在“调试控制台”窗口中获得如下所示的输出。否则,我的所有 Python 程序此时都可以正常工作并按预期运行。

\n
1   HIToolbox                           0x00007ff81116c0c2 _ZN15MenuBarInstance22RemoveAutoShowObserverEv + 30\n2   HIToolbox                           0x00007ff8111837e3 SetMenuBarObscured + 115\n3   HIToolbox                           0x00007ff81118a29e _ZN13HIApplication11FrontUILostEv + 34\n4   HIToolbox                           0x00007ff811183622 _ZN13HIApplication15HandleActivatedEP14OpaqueEventRefhP15OpaqueWindowPtrh + 508\n5   HIToolbox                           0x00007ff81117d950 _ZN13HIApplication13EventObserverEjP14OpaqueEventRefPv + 182\n6   HIToolbox                           0x00007ff811145bd2 _NotifyEventLoopObservers + 153\n7   HIToolbox                           0x00007ff81117d3e6 AcquireEventFromQueue + 494\n8   HIToolbox                           0x00007ff81116c5a4 ReceiveNextEventCommon + 725\n9   HIToolbox                           0x00007ff81116c2b3 _BlockUntilNextEventMatchingListInModeWithFilter + 70\n10  AppKit                              0x00007ff80a973f33 _DPSNextEvent + 909\n11  AppKit                              0x00007ff80a972db4 -[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 1219\n12  AppKit                              0x00007ff80a9653f7 -[NSApplication run] + 586\n13  _macosx.cpython-310-darwin.so       0x0000000110407e22 show + 162\n14  Python                              0x0000000100bb7595 cfunction_vectorcall_NOARGS + 101\n15  Python                              0x0000000100c9101f call_function + 175\n16  Python                              0x0000000100c8a2c4 _PyEval_EvalFrameDefault + 34676\n17  Python                              0x0000000100c801df _PyEval_Vector + 383\n18  Python                              0x0000000100c9101f call_function + 175\n19  Python                              0x0000000100c8a2c4 _PyEval_EvalFrameDefault + 34676\n20  Python                              0x0000000100c801df _PyEval_Vector + 383\n21  Python                              0x0000000100b53f61 method_vectorcall + 481\n22  Python                              0x0000000100c8a4f2 _PyEval_EvalFrameDefault + 35234\n23  Python                              0x0000000100c801df _PyEval_Vector + 383\n24  Python                              0x0000000100c9101f call_function + 175\n25  Python                              0x0000000100c8a2c4 _PyEval_EvalFrameDefault + 34676\n26  Python                              0x0000000100c801df _PyEval_Vector + 383\n27  Python                              0x0000000100cf536d pyrun_file + 333\n28  Python                              0x0000000100cf4b2d _PyRun_SimpleFileObject + 365\n29  Python                              0x0000000100cf417f _PyRun_AnyFileObject + 143\n30  Python                              0x0000000100d20047 pymain_run_file_obj + 199\n31  Python                              0x0000000100d1f815 pymain_run_file + 85\n32  Python                              0x0000000100d1ef9e pymain_run_python + 334\n33  Python                              0x0000000100d1ee07 Py_RunMain + 23\n34  Python                              0x0000000100d201e2 pymain_main + 50\n35  Python                              0x0000000100d2048a Py_BytesMain + 42\n36  dyld                                0x00007ff80741b310 start + 2432\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 尽管据我所知,我的任何 Python 程序中都没有任何内容可以直接导致这些行出现在调试控制台窗口中,但为什么这些行会出现在调试控制台窗口中?
  2. \n
  3. 它们有何帮助?如果需要,如何使用它们?
  4. \n
  5. 我怎样才能防止它们默认出现?
  6. \n
\n

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

\n
\n

截至 2023 年 1 月 2 日更新

\n

我发现我的初始帖子中不需要的输出是由 Python 程序中的 matplotlib.pyplot.show 函数触发的。即使我运行如下简单的程序,我也会得到该输出:

\n
import matplotlib.pyplot as plt\n\nx = [1, 2, 3]\ny = [1, 2, 3]\nplt.plot(x, y)\n\nplt.show()\n
Run Code Online (Sandbox Code Playgroud)\n

当我从上面的代码中删除 plt.show() 时,36 行不需要的输出不会出现,但图形也不会显示。同样,除了不需要的输出之外,我的所有带有 show 函数的 Python 程序似乎都能正常工作,包括由 show 函数触发的图形显示。我的 Mac 上安装了 Matplotlib 3.5.2。

\n

如果我直接通过命令行运行相同的程序(假设 Python 程序的名称是test.py):

\n
python3 test.py\n
Run Code Online (Sandbox Code Playgroud)\n

但当我跑步时却不是test.pyIDLE、Python\xe2\x80\x99s 集成开发和学习环境或 Jupyter 笔记本中的代码时则不然。

\n

我可以从 Python 程序中删除 show 函数以避免不需要的输出,但图表将不会出现,我更喜欢使用 show 函数而不是临时解决方案。

\n
\n

截至 2023 年 1 月 4 日更新

\n

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

\n

该问题也与 macOS Ventura v13.1 有关,这并非难以置信,但我不\xe2\x80\x99 不知道如何解决,我的问题仍然存在。

\n
\n

截至 2023 年 1 月 6 日更新

\n

将 Matplotlib 升级到 v3.6.2 但不需要的输出问题尚未解决。

\n
\n

截至 2023 年 1 月 8 日更新

\n

尝试了 Matplotlib v3.6.2 和 Python v3.11.1。不需要的输出问题仍然存在。

\n
\n

截至 2023 年 1 月 15 日更新

\n

已将此问题作为错误报告给 GitHub 上的 Matplotlib 开发人员:“ [Bug]:显示函数触发不需要的额外输出 #24997\n

\n
\n

截至 2023 年 1 月 16 日更新

\n

我发现只有当“系统设置”->“桌面&Dock”->“菜单栏”下的“自动隐藏和显示菜单栏”选项设置为Always(这是我的设置)或 时,才会出现不需要的输出on Desktop OnlyIn Full Screen Only如果我将该选项设置为或 ,则不会出现不需要的输出Never

\n
\n

截至 2023 年 1 月 18 日更新

\n

GitHub 上的 Matplotlib 和 Python 开发人员都认为,他们可以重现的不需要的输出是 macOS Ventura 13.1 中的错误造成的,因此他们对此无能为力。

\n

有关详细信息,请参阅我提到的在 GitHub 上为 Matplotlib 提交的错误报告以及我后来在 GitHub 上再次通过 Python/CPython 为 Tkinter 提交的错误报告(“ Tkinter 在最新的 macOS 中导致不需要的输出”)之后的相应讨论。我还被告知,针对后者,反馈助理报告现已提交给苹果公司,内容涉及已发现的错误。

\n
\n

截至 2023 年 1 月 25 日更新

\n

今天我将 Mac 上的 macOS 升级到了 Ventura 13.2(并在 2 月中旬发布时进一步升级到了 Ventura 13.2.1)。没有任何变化,只是运行小程序时不需要的输出现在相当长(85 行)。和以前一样,程序运行良好,否则如果我更改 Mac 的菜单栏设置(例如更改为Never.

\n

Ben*_*het 6

看了一会儿,它似乎与苹果菜单栏(又名顶部栏)有关。

“解决方法”

在 Mac 设置中,设置"Automatically hide and show the menu bar"“从不”以避免获取这些堆栈跟踪日志。

> 存在的问题:

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

> 问题不存在:

Mac 设置,值设置为“从不”

结论

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


Alp*_*per 1

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