有问题的代码:
print('s')
y=1/0
我完全理解错误(它只是除以零),导致运行时(在 PyCharm 上,通过按 Shift+F10,正常方式)以下输出:
C:\Users\myname\PycharmProjects\test1\.venv\Scripts\python.exe C:\Users\myname\PycharmProjects\test1\Functions\error.py
Traceback (most recent call last):
File "C:\Users\myname\PycharmProjects\test1\Functions\error.py", line 2, in <module>
y=1/0
~^~
ZeroDivisionError: division by zero
s
Process finished with exit code 1
或者这个(现在请注意,打印的 's' 出现在回溯之前而不是之后:
C:\Users\myname\PycharmProjects\test1\.venv\Scripts\python.exe C:\Users\myname\PycharmProjects\test1\Functions\error.py
s
Traceback (most recent call last):
File "C:\Users\myname\PycharmProjects\test1\Functions\error.py", line 2, in <module>
y=1/0
~^~
ZeroDivisionError: division by zero
Process finished with exit code 1
这是一个错误。我在具有更多语句的程序中遇到过这个问题,有时回溯隐藏在它们之前。
我尝试搜索类似的问题,但他们并不关注如果存在回溯,输出显示的顺序是否重要,并且没有如此简单的错误,而且它们更旧。
一些粗略的研究让我相信这确实是 PyCharm 中的一个错误(并且似乎在 JetBrains 的其他 IDE 中普遍存在),与
stdout
和 stderr
的打印方式有关。
@wolph
,python-progressbar
项目的所有者,比我更雄辩地说:
在过去的 12 年中,PyCharm 中的错误在于 stderr 和 stdout 之间的计时,它看起来完全随机,导致结果交错。
JetBrains 面向公众的错误跟踪器已经对这种错误行为进行了多次报告。其中一些(看似)相关的内容仍标记为“开放”:
在 2019 年提供了一个潜在的解决方法请注意,默认情况下仍不能保证考虑到该错误在超过 12 年的报告后仍然普遍存在,看来这并不是 JetBrains 需要优先解决的问题。如果此功能对于您在项目中正确使用很重要(并且无论出于何种原因,上述解决方法在您的情况下不起作用),我个人建议评估另一个 IDE。有很多可供选择。stdout
和
之间的正确排序,但有一种方法可以使用stderr
注册表项强制执行。要启用它,请执行以下操作: 主菜单上的“帮助|查找操作...”;找到“注册表...”项并打开它;run.processes.with.redirectedErrorStream
- 启用
run.processes.with.redirectedErrorStream
- 键。
启用它将合并 IDE 生成的进程的 stdout 和 stderr 流。这将确保来自 stdout/stderr 的消息正确排序。[...]
但是,作为代价,合并 stdout 和 stderr 将使它们难以区分:错误输出将打印为普通文本。使用 ANSI 颜色以不同方式突出显示错误输出。 请注意,该注册表项仅支持请求的运行/调试配置。如果您的运行/调试配置不支持它,请在问题跟踪器中提交请求。