TL; DR:
{1}}结果未在Windows控制台中更新。在IDLE中执行罚款。即使Windows控制台未更新,程序仍在执行。
背景
我有一个文件,print()
包含:
编辑包括我以前查看控制台是否正在更新的条件。最终,一系列test.py
值永远不会再在Console中打印,并且控制台永远不会向上滚动(就像通常在底部生成输出时一样)。
X
当我在count = 0
while True:
print ("True")
count += 1
if count == 10:
print ("XXXXXXXXX")
count = 0
中运行时,显然会打印出大量的cmd.exe
。
但是,运行约25秒后,它会再停止打印,但程序仍在运行,可以在任务管理器中看到。
我有一个程序,其中包含一些进度指标,即使因为True
未在控制台输出中显示而超出50%,最终会保持50%。
编辑:真正的用例问题。
上面的代码只是一个测试文件,用于查看Console中的打印是否在所有程序中停止,而不是我正在运行的程序。在实践中,我的程序打印到控制台,看起来像:
print()
line [10] >> Progress 05%
不是真实的,但我只是在此输入,以显示line [10]
在控制台窗口中发送到该行。随着我的程序继续,它会递增:
print()
每次line [10] >> Progress 06%
line [10] >> Progress 11%
.
.
.
line [10] >> Progress 50%
被覆盖。我使用ANSI转义字符和line [10]
来相应地移动Console游标:
colorama
这会将光标向左移动1000列,向上移动1行(因此上一行的开头)。
在控制台中print('\x1b[1000D\x1b[1A')
不再显示的地方发生了一些事情,因为最终下一部分Python被执行:
print("Progress " + prog + "%")
我验证了放入文件夹的结果。因此,当控制台没有更新时,程序继续运行。
修改:以下是运行line [11] >> Program Complete...
更新的脚本。
stdout
简而言之,我从一个线程向队列传递消息。然后我更新一个包含唯一单元ID的字典。我更新了值,将控制台中的光标移动到打印列表的左上角位置,并在其上打印。
问题:
使用stdout时,在一段时间内打印到它的次数是否有限制?
答案 0 :(得分:4)
这可能是一种错觉(可能是因为控制台中的线路有最大限制,而新的线路只是替换了第一条线路。)
绝对没有限制你可以print
多少。您可以使用更改每次迭代的内容来验证这一点,例如,计算迭代次数的循环:
import itertools
for i in itertools.count():
print(i, "True")
答案 1 :(得分:2)
我无法使用64位Python 3.6.2和colorama 0.3.9在Windows 10中重现该问题。这是我测试的简单示例:
import colorama
colorama.init()
def test(M=10, N=1000):
for x in range(M):
print('spam')
for n in range(N):
print('\x1b[1000D\x1b[' + str(M + 1) + 'A')
for m in range(M):
print('spam', m, n)
每次传递成功覆盖前一行。这是循环N(1000)次的最终输出:
>>> test()
spam 0 999
spam 1 999
spam 2 999
spam 3 999
spam 4 999
spam 5 999
spam 6 999
spam 7 999
spam 8 999
spam 9 999
如果此示例失败,请更新您的问题并添加您正在测试的Windows,Python和colorama版本。
答案 2 :(得分:1)
听起来它可能是系统限制,而不是Python进程问题?我从未遇到过与print语句(或任何内置函数)相关的“挂起”,但您可能希望查看映射性能和内存使用情况:
High Memory Usage Using Python Multiprocessing
至于在一段时间内可以打印多少次,这几乎完全取决于系统执行代码的速度。您可以跨多个平台运行一些基准测试(执行时间/执行次数)来测试特定系统规格的性能,但我想说您的问题的可能原因是系统/环境相关。