我正在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!
答案 0 :(得分:1)
对于背景,如果您从命令面板中使用View Package File
来查看Default/exec.py
,则可以检查用于执行程序的代码并将其输出显示在面板中。
作为简短的摘要,该程序在后台线程中执行,并且使用以下代码读取stdout
和stderr
的输出:
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的输出窗口,该窗口似乎无法正确显示回车符(它用换行符代替)。