打印到(和覆盖)状态标识的同一行

2024-04-20 02:26:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我在macosx和python3上运行以下程序。我使用Sublime Text 3的Python3默认构建系统运行代码段,并在同一程序的输出窗口中显示输出。你知道吗

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!

Tags: texttest程序is系统thismacosxpython3
3条回答

对于后台,如果使用命令调色板中的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 core交互,那么它将以如下方式结束:

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

也就是说,无论您提供什么字符,它们都直接附加到输出缓冲区,而不考虑它们可能包含什么。你知道吗

如果您要提供一个定制的构建target(一个有点高级的插件,但仍然有可能),那么可以修改这个行为,尽管要让它在MacOS上工作可能很困难,因为在那个平台上无法区分\r意味着什么。你知道吗

代码在正常的命令行窗口中正确显示。问题在于Sublime的输出窗口,它似乎没有正确显示回车符(它用换行符代替回车符)。你知道吗

实际上,您需要在字符串的开头添加'\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!  

相关问题 更多 >