微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用print太多会导致失败?

TL; DR:

print()结果在Windows控制台中不会更新。 在IDLE中执行罚款。 程序正在执行,即使Windows控制台没有更新。

背景

我有一个文件test.py ,其中包含:

我如何使我的function粘性重载iostream提取操作符

在DLL中的控制台输出窗口

Java可以更改自己的控制台的代码页吗?

将状态栏添加到C ++控制台应用程序

为什么在一段时间之后,Windows控制台会丢失命令行历史logging(向上箭头)?

编辑:包括我用来查看控制台是否正在更新的条件。 最终,一系列X值永远不会在控制台中再次打印,控制台也不会再次滚动(正如在底部生成输出时一样)。

count = 0 while True: print ("True") count += 1 if count == 10: print ("XXXXXXXXX") count = 0

当我运行这个cmd.exe它显然打印了一个非常大数目的True 。

但是,运行约25秒后,程序仍然在运行,并且可以在任务pipe理器中看到,它将停止打印。

我有一个程序,其中有一些进度指标,即使它们正在移动50%以上,但由于print()没有显示在控制台输出中,所以最终仍然停留在50%。

编辑:真正的用例问题。

上面的代码只是一个testing文件,以查看在控制台中的打印是否在所有程序中停止,而不是我正在运行的程序。 在实践中,我的程序打印到控制台,如下所示:

line [10] >> Progress 05%

在line [10]不是真实的,但我只是在这里input,告诉你print()发送到控制台窗口中的那一行。 随着我的程序继续增加

line [10] >> Progress 06% line [10] >> Progress 11% . . . line [10] >> Progress 50%

每一line [10]被覆盖。 我使用ANSI转义字符和colorama来相应地移动控制台游标:

print('x1b[1000Dx1b[1A')

这将光标向左移动1000列并向上移动1行(所以前一行的开始)。

在控制台中没有显示print("Progress " + prog + "%")地方正在发生,因为最终Python的下一个位被执行:

line [11] >> Program Complete...

我核实了放入文件夹的结果。 所以程序继续运行而控制台没有更新。

编辑:这是脚本运行更新到stdout 。

def check_queue(q,dates,dct): out = 0 height = 0 # print the initial columns and rows of output # each cell has a unique id # so they are stored in a dictionary # then I convert to list to print by subscripting for x in range(0,len(list(dct.values())),3): print("tt".join(list(dct.values())[x:x+3])) height +=1 # to determine where the top is for cursor while True: if out != (len(dates) * 2): try: status = q.get_Nowait() dct[status[1]] = status[2] print('x1b[1000Dx1b[' + str(height + 1) + 'A') # since there was a message that means a value was updated for x in range(0,3): print("tt".join(list(dct.values())[x:x+3])) if status[0] == 'S' or 'C' or 'F': out += 1 except queue.Empty: pass else: break

简而言之,我将消息从一个线程传递给队列。 然后我更新一个包含唯一单元ID的字典。 我更新值,将控制台中的光标移动到打印列表的左上angular位置,然后打印。

题:

使用标准输出时,您可以在一段时间内打印多less次?

AttributeError:StringIO实例没有属性'encoding'

我怎样才能在c ++控制台中写入文本而不会破坏行

最有效的写入控制台的方法

将bash脚本的输出写入date文件

是否有可能拦截来自另一个进程的控制台调用

这可能是一个错觉(也许是因为在控制台中有最大限度的行数,而新的只是替换第一个)。

毫无疑问,你可以print多少。 你可以用改变每次迭代的东西验证这个,例如一个循环来计算迭代次数

import itertools for i in itertools.count(): print(i,"True")

我无法在Windows 10中使用64位Python 3.6.2和colorama 0.3.9重现该问题。 这是我测试的简单例子:

import colorama colorama.init() def test(M=10,N=1000): for x in range(M): print('spam') for n in range(N): print('x1b[1000Dx1b[' + 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版本。

听起来这可能是一个系统的限制,而不是一个Python的进程问题? 我从来没有碰到与打印语句(或任何内置函数)相关的“挂起”,但是您可能想要查看映射性能和内存使用情况:

使用Python多重处理的高内存使用率

就一段时间内可以打印多少次而言,这几乎完全取决于系统执行代码的速度。 你可以在几个平台上运行一些基准测试(执行时间/执行次数)来测试特定系统规格的性能,但是我想说你的问题的可能原因是系统/环境相关的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐