gpt4 book ai didi

python - 打印到(并覆盖)状态指示器的同一行

转载 作者:行者123 更新时间:2023-12-01 09:16:59 25 4
gpt4 key购买 nike

我在 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!

最佳答案

对于背景,如果您使用命令面板中的查看包文件来查看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 的处理方式相同。

除此之外,如果您通过保持线程安全并允许其与 Sublime 核心交互的保护代码跟踪对 append_string() 的调用,它最终会出现在一行中:像这样:

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

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

如果您要提供自定义构建target(一个有点高级的插件,但仍然可能),则可以修改此行为,尽管使其在 MacOS 上工作可能会很棘手,因为会出现无法区分 \r 在该平台上的含义。

关于python - 打印到(并覆盖)状态指示器的同一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51159297/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com