打印(覆盖)状态指示符的同一行

时间:2018-07-03 16:32:14

标签: python python-3.x sublimetext3

我正在Mac OSX和Python 3上运行以下代码。我正在使用Sublime Text 3的默认构建系统(针对Python 3)运行代码段,并在同一程序的输出窗口中显示输出。

print('Starting test.')
for i in range(1,100):
    print('This is a test. ' + str(i), end='\r')
print('Test done!')

我想要的输出基本上是同一行的重复,每次都覆盖控制台中的前一行。最后,理想情况下,我应该只在输出窗口中看到以下内容。

 Starting test.
 This is a test. 99
 Test done!

我希望end='\r'可以使我了解这种行为,但事实并非如此。相反,我看到了:

 Starting test.
 This is a test. 1
 This is a test. 2
 This is a test. 3
 [...]
 This is a test. 99
 Test done!

3 个答案:

答案 0 :(得分:1)

对于背景,如果您从命令面板中使用View Package File来查看Default/exec.py,则可以检查用于执行程序的代码并将其输出显示在面板中。

作为简短的摘要,该程序在后台线程中执行,并且使用以下代码读取stdoutstderr的输出:

def read_fileno(self, fileno, execute_finished):
    decoder_cls = codecs.getincrementaldecoder(self.listener.encoding)
    decoder = decoder_cls('replace')
    while True:
        data = decoder.decode(os.read(fileno, 2**16))

        if len(data) > 0:
            if self.listener:
                self.listener.on_data(self, data)
        else:
            try:
                os.close(fileno)
            except OSError:
                pass
            if execute_finished and self.listener:
                self.listener.on_finished(self)
            break

也就是说,每当他们读取任何数据时,就会在侦听结果的对象中调用on_data(),在这种情况下,该对象就是exec命令本身。该方法的实现如下所示:

def on_data(self, proc, data):
    # Normalize newlines, Sublime Text always uses a single \n separator
    # in memory.
    data = data.replace('\r\n', '\n').replace('\r', '\n')

    self.append_string(proc, data)

内部Sublime使用\n作为行分隔符,因此在Windows \r\n上解释为\n,在MacOS \r上解释为\n好吧。

因此,一方面,这并没有达到您的期望,因为您的\r\n的待遇相同。

此外,如果您通过保护代码跟踪对append_string()的调用,以使其保持线程安全并允许其与Sublime内核进行交互,则它会以如下所示结束: >

    self.output_view.run_command(
        'append',
        {'characters': characters, 'force': True, 'scroll_to_end': True})

也就是说,无论您提供什么字符,它们都会直接附加到输出缓冲区中,而与它们可能包含的内容无关。

如果您要提供自定义版本target(有些高级插件,但仍然可以),则可以修改此行为,尽管要使其在MacOS上运行可能很棘手,因为无法区分\r在该平台上的含义。

答案 1 :(得分:0)

实际上,您需要在字符串的开头添加'\ r'。

print('Starting test.')
for i in range(1,100):
    print('\rThis is a test.'+str(i), end="")
print('\nTest done!')

输出

Starting test.
This is a test.99
Test done!  

答案 2 :(得分:0)

该代码在正常的命令行窗口中正确显示。问题在于Sublime的输出窗口,该窗口似乎无法正确显示回车符(它用换行符代替)。