Python IntelliJ IDEA 中的输出乱序
Python output in IntelliJ IDEA is out of order
我有一个非常简单的Python程序。
def square(a):
for i in a:
yield i*i
def main():
a = [1, 2, 3]
b = square(a)
print(b)
print(next(b))
print(next(b))
print(next(b))
print(next(b))
if __name__ == "__main__":
main()
当我从命令行 运行 时,我得到了以下结果,这正是我所期望的。
c:\test1>python main.py
<generator object square at 0x000002982E07A4A0>
1
4
9
Traceback (most recent call last):
File "main.py", line 16, in <module>
main()
File "main.py", line 12, in main
print(next(b))
StopIteration
c:\test1>
我运行 重复了很多次,结果总是一样的。但是,当我将带有 Python 插件的 IntelliJ IDEA 用于 运行 同一个程序时,我得到了这个:
C:\Python\python.exe c:/test1/main.py
Traceback (most recent call last):
File "c:/my_projects/python1/main.py", line 16, in <module>
main()
File "c:/my_projects/python1/main.py", line 12, in main
print(next(b))
StopIteration
<generator object square at 0x000001799923C580>
1
4
9
Process finished with exit code 1
或者这样:
C:\Python\python.exe c:/test1/main.py
<generator object square at 0x00000230F551C580>
1
4
9
Traceback (most recent call last):
File "c:/my_projects/python1/main.py", line 16, in <module>
main()
File "c:/my_projects/python1/main.py", line 12, in main
print(next(b))
StopIteration
Process finished with exit code 1
为什么会这样?如何在 IntelliJ IDEA 中得到稳定的结果?
这里的问题是 print
输出到 stdout
而异常消息到 stderr
。在您的终端中,他们得到输出 as-is,但出于效率原因,IDE 可能会对 stdout
进行一些缓冲。相同的缓冲区不会应用于 stderr
,因为它需要确保输出尽快出现在屏幕上并且不会冒缓冲区被过早清除的风险。这意味着有时(根据我的经验,这种情况经常发生)像您这样的异常消息会 在 正常输出之前出现,而您希望这些正常输出已经显示。
Kemp 的解释是正确的。
PyCharm 问题跟踪器中有相应的工单 https://youtrack.jetbrains.com/issue/PY-37396
另见 https://youtrack.jetbrains.com/issue/PY-32776
作为一种可能的解决方法,您可以为 运行 配置启用 在输出控制台中模拟终端 选项(运行 | 编辑配置...) .
我有一个非常简单的Python程序。
def square(a):
for i in a:
yield i*i
def main():
a = [1, 2, 3]
b = square(a)
print(b)
print(next(b))
print(next(b))
print(next(b))
print(next(b))
if __name__ == "__main__":
main()
当我从命令行 运行 时,我得到了以下结果,这正是我所期望的。
c:\test1>python main.py
<generator object square at 0x000002982E07A4A0>
1
4
9
Traceback (most recent call last):
File "main.py", line 16, in <module>
main()
File "main.py", line 12, in main
print(next(b))
StopIteration
c:\test1>
我运行 重复了很多次,结果总是一样的。但是,当我将带有 Python 插件的 IntelliJ IDEA 用于 运行 同一个程序时,我得到了这个:
C:\Python\python.exe c:/test1/main.py
Traceback (most recent call last):
File "c:/my_projects/python1/main.py", line 16, in <module>
main()
File "c:/my_projects/python1/main.py", line 12, in main
print(next(b))
StopIteration
<generator object square at 0x000001799923C580>
1
4
9
Process finished with exit code 1
或者这样:
C:\Python\python.exe c:/test1/main.py
<generator object square at 0x00000230F551C580>
1
4
9
Traceback (most recent call last):
File "c:/my_projects/python1/main.py", line 16, in <module>
main()
File "c:/my_projects/python1/main.py", line 12, in main
print(next(b))
StopIteration
Process finished with exit code 1
为什么会这样?如何在 IntelliJ IDEA 中得到稳定的结果?
这里的问题是 print
输出到 stdout
而异常消息到 stderr
。在您的终端中,他们得到输出 as-is,但出于效率原因,IDE 可能会对 stdout
进行一些缓冲。相同的缓冲区不会应用于 stderr
,因为它需要确保输出尽快出现在屏幕上并且不会冒缓冲区被过早清除的风险。这意味着有时(根据我的经验,这种情况经常发生)像您这样的异常消息会 在 正常输出之前出现,而您希望这些正常输出已经显示。
Kemp 的解释是正确的。
PyCharm 问题跟踪器中有相应的工单 https://youtrack.jetbrains.com/issue/PY-37396
另见 https://youtrack.jetbrains.com/issue/PY-32776
作为一种可能的解决方法,您可以为 运行 配置启用 在输出控制台中模拟终端 选项(运行 | 编辑配置...) .