在终端中同一行中每秒执行一次命令

3

我有一个非常简单的脚本。在手动停止脚本之前,它会每隔1秒钟在终端上打印当前时间。到目前为止,我唯一遇到的问题是回车符“\r”命令不能按预期工作,无法返回并使用以前的同一行。每次输出的时间不会被覆盖,而是像这样:

Good morning!
It's 03:10:13 PM on Wednesday, Jan 25, 2017
It's 03:10:14 PM on Wednesday, Jan 25, 2017
It's 03:10:15 PM on Wednesday, Jan 25, 2017
It's 03:10:16 PM on Wednesday, Jan 25, 2017
It's 03:10:17 PM on Wednesday, Jan 25, 2017
It's 03:10:18 PM on Wednesday, Jan 25, 2017
It's 03:10:19 PM on Wednesday, Jan 25, 2017
It's 03:10:20 PM on Wednesday, Jan 25, 2017
It's 03:10:21 PM on Wednesday, Jan 25, 2017

我不能在终端上执行这个操作吗?我在两次操作之间加入了1秒的暂停,这有问题吗?

这是我的代码:

import time
import sys

print("Good morning!")
while True:
    time_str = "It's %I:%M:%S %p on %A, %b %d, %Y\r"
    print time.strftime(time_str)
    sys.stdout.flush()
    time.sleep(1)

一些额外信息:我在Ubuntu系统上使用bash shell。


2
你必须在 print() 中使用 end="\r",而不是在 time_strformat() 中使用。 - furas
可能是如何在终端中重写输出的重复问题。 - Tagc
@Tagc 我已经阅读了它们,但并没有解决我的问题。在 furas 那里,我已经尝试过了,并编辑了我的代码以展示。 - Jordan Pagni
2个回答

1
你必须将回车符放在文本开头,并用""替换回车符。
import time
import sys

print("Good morning!")
while True:
    time_str = "\rIt's %I:%M:%S %p on %A, %b %d, %Y"
    print(time.strftime(time_str), end="")
    sys.stdout.flush()
    time.sleep(1)

我尝试过了,仍然无法在同一行打印。 - Jordan Pagni
+1,这在Windows 10下的Pycharm中很好地运行(IDLE仍然有问题,我怀疑任何解决方案都无法为其工作)。 - Tagc
同样在 Windows 10 的 mintty 终端和命令提示符下成功测试。 - Tagc
可能只是Ubuntu的问题,因为似乎这些解决方案都不起作用。 - Jordan Pagni

1

print()中,你需要使用end="\r"来替换默认的end="\n"

import time
import sys

print("Good morning!")
while True:
    time_str = "It's %I:%M:%S %p on %A, %b %d, %Y"
    print(time.strftime(time_str), end="\r")
    sys.stdout.flush()
    time.sleep(1)

我使用基于Ubuntu的Linux Mint,在终端中\r对我有效(但是可能Ubuntu使用不同的终端)。


您在使用end="\r"时遇到错误,这意味着您正在使用的是Python 2而不是Pyhton 3 - 然后您需要在print末尾添加逗号来跳过默认的\n
import time
import sys

print "Good morning!"
while True:
    time_str = "It's %I:%M:%S %p on %A, %b %d, %Y\r"
    print time.strftime(time_str),  # <-- comma to skip "\n"
    sys.stdout.flush()
    time.sleep(1)

是的,我也尝试过了。现在我得到了一个SyntaxError: invalid syntax错误,指向'end='\r'中的'='。我已经更新了我的代码。 - Jordan Pagni
不幸的是,在 PyCharm(输出:Good morning!,没有其他内容)和 IDLE 3.6.0(输出:Good morning! It's 10:42:35 PM on Wednesday, Jan 25, 2017It's 10:42:36 PM on Wednesday, Jan 25, 2017It's 10:42:37 PM on Wednesday, Jan 25, 2017...)上在 Windows 10 上测试时,这似乎对我无效。 - Tagc
@Tagc 这完全取决于控制台/终端 - 并非所有控制台都支持\r - furas
@JordanPagni 你确定你使用的是 Python 3 吗?如果你使用的是 Python 2,你可能会遇到这个错误。 - furas
可能更改终端 :) - furas
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接