Jupyter Notebook和Linux终端中打印字符串(sys.stderr.write)的不同行为

时间:2018-07-04 08:07:14

标签: python string terminal jupyter-notebook jupyter

在Jupyter Notebook中,运行以下Python代码时,将打印2到9的数字,一个接一个。     导入时间

for i in range(1,10):
    time.sleep(1)
    sys.stderr.write('\r %d' % i)
    sys.stderr.flush()

问题1:为什么不打印1?

问题2:为什么数字一个接一个地打印,我的意思是,当打印较大的数字时,立即较小的数字消失了(真棒)? 为什么{{1} }以这种方式工作,但是sys.stderr.write('\r %d' % i)以“正常”的方式工作,显示所有数字?

在Linux终端中运行上述确切代码时。输出再次不同:

sys.stderr.write('%d \r' % i)

如果将行 13 23 33 43 53 63 73 83 93 更改为sys.stderr.write('\r %d' % i),输出将变为:

sys.stderr.write('%d \r' % i)

这太奇怪了。

问题3:为什么在Linux终端上运行上述代码会有不同的输出?

1 个答案:

答案 0 :(得分:0)

  

问题1:为什么不打印1个?

它确实打印了。尝试更长的睡眠。

  

Q2:为什么数字一个接一个地打印,我的意思是,当打印一个较大的数字时,立即较小的数字消失了(真棒)?

这是因为您使用的是回车符\r而不是换行符\n,换行符会将光标返回到行的开头,而不是将其前进到下一行。您还可以使用退格\b在终端中覆盖内容,将光标移回一个空格。

  

Q3:为什么在Linux终端上运行上述代码会有不同的输出?

我不确定您指的是哪个终端。某些终端不支持覆盖,因此刷新的顺序可能会影响输出。

另外,请查看write方法上的文档字符串,

  idlelib.run.PseudoOutputFile实例的

write方法       将字符串写入流。       返回写入的字符数(始终等于       字符串的长度)。

它返回您传入的字符串的长度。在Python Shell(REPL)中,所有返回值在函数返回后得到打印。在空闲的地方尝试一下,其中stdin和stderr以不同的颜色打印:

>>> sys.stderr.write('x')

但是看看如果在终端中运行它会发生什么情况,

>>> sys.stdout.write('abc\r')
4bc

首先打印abc,然后将光标返回到行首。然后返回4,因为字符串的长度为len 4,所以Python的REPL在光标的当前位置打印该字符,从而覆盖a