如何在 Windows 命令行中覆盖/打印当前行?

2025-03-25 08:47:00
admin
原创
20
摘要:问题描述:在 Unix 上,我可以使用`(回车)或`(退格)在 shell 中覆盖当前行(打印已经可见的文本)。我可以通过 Python 脚本在 Windows 命令行中实现相同的效果吗?我尝试了 curses 模块但它似乎在 Windows 上不可用。解决方案 1:是的:import sys import...

问题描述:

在 Unix 上,我可以使用`
(回车)或`(退格)在 shell 中覆盖当前行(打印已经可见的文本)。

我可以通过 Python 脚本在 Windows 命令行中实现相同的效果吗?

我尝试了 curses 模块但它似乎在 Windows 上不可用。


解决方案 1:

是的:

import sys
import time

def restart_line():
    sys.stdout.write('
')
    sys.stdout.flush()

sys.stdout.write('some data')
sys.stdout.flush()
time.sleep(2) # wait 2 seconds...
restart_line()
sys.stdout.write('other different data')
sys.stdout.flush()

解决方案 2:

我知道这已经很老了,但是我想告诉我的版本(它可以在 cmd 中在我的 PC 上运行,但在空闲状态下不能运行)覆盖 Python 3 中的一行:

>>> from time import sleep
>>> for i in range(400):
>>>     print("
" + str(i), end="")
>>>     sleep(0.5)

编辑:
它适用于 Windows 和 Ubuntu

解决方案 3:

import sys 
import time

for i in range(10):
    print '
',         # print is Ok, and comma is needed.
    time.sleep(0.3)
    print i,
    sys.stdout.flush()  # flush is needed.

如果在 IPython-notebook 上,就像这样:

import time
from IPython.display import clear_output

for i in range(10):
    time.sleep(0.25)
    print(i)
    clear_output(wait=True)

http://nbviewer.ipython.org/github/ipython/ipython/blob/master/examples/notebooks/Animations%20Using%20clear_output.ipynb

解决方案 4:

我刚刚遇到了这个问题。`
即使在 Windows 命令提示符中,您仍然可以使用,但是它只会带您返回到上一个换行符 (
`)。

如果你做这样的事情:

cnt = 0
print str(cnt)
while True:
    cnt += 1
    print "
" + str(cnt)

您将获得:

0
1
2
3
4
5
...

这是因为`
`只返回到最后一行。由于您已经在最后一个 print 语句中写入了换行符,因此您的光标将从新空行的开头移动到同一新空行的开头。

为了说明起见,打印第一个 0 后,光标将位于这里:

0
| # <-- Cursor

当你 时`
`,你转到了队列的开头。但你已在队列的开头。

解决方法是避免打印`
字符,这样您的光标就在同一行上并
正确覆盖文本。您可以使用 来做到这一点print 'text',`。逗号可防止打印换行符。

cnt = 0
print str(cnt),
while True:
    cnt += 1
    print "
" + str(cnt),

现在它将正确地重写行。

请注意,这是 Python 2.7,因此有这些print语句。

解决方案 5:

简便方法:

import sys
from time import sleep
import os

#print(" coordinate;[x coordinateH Hello")
os.system('cls')
sleep(0.2)
print("[]")
sleep(0.2)
print("  []")
sleep(0.2)
print("    []")
sleep(0.2)
print("      []")
sleep(0.2)
print("        []")
sleep(0.2)
print("      []")
sleep(0.2)
print("    []")
sleep(0.2)
print("  []")
sleep(0.2)
print("[]")
sleep(0.2)

解决方案 6:

如果您只是想更新上一​​行,方法很简单:

import time
for i in range(20):
    print str(i) + '
',
    time.sleep(1)

解决方案 7:

最简单的方法是使用两个 \r - 一个在开头,一个在结尾

for i in range(10000):
    print('
'+str(round(i*100/10000))+'%  Complete
'),

它会很快

解决方案 8:

在 PyCharm 2020.3 和 Python 版本 3.9 上进行了测试,为了覆盖书面打印输出,我使用以下命令:

from time import sleep

for x in range(10):
    print(f'
 {x}', end='')
    sleep(0.6)

这是我在程序中主要使用的代码。使用`end='
'`将覆盖整个文本,忽略睡眠。

在实际场景中,我的设置如下:

    def progress_callback(progress):
        print(f'
Downloading File: {progress.dlable.file_name}  Progress: ' + '{0:.2f}%'.format(progress.percent), end='')
        # `return True` if the download should be canceled
        return False

    print('
Download complete!)

覆盖功能后的打印必须在新行中,否则之前的同一行将被覆盖。

解决方案 9:

在 Windows(python 3)上,它似乎可以工作(不直接使用 stdout):

import sys

for i in reversed(range(0,20)):
  time.sleep(0.1)
  if(i == 19):
    print(str(i), end='', file=sys.stdout)
  else:
    print("
{0:{width}".format(str(i), width = w, fill = ' ', align = 'right'), end='', file=sys.stdout)
  sys.stdout.flush()
  w = len(str(i))

每次调用打印函数时都会更新同一行。

此算法可以改进,但发布出来是为了展示您可以做什么。您可以根据需要修改该方法。

解决方案 10:

感谢大家在这里提供的所有有用答案。我需要这个 :)

我发现 nosklo 的答案特别有用,但我希望通过将所需输出作为参数传递,将某些东西完全包含在函数中。另外,我实际上不需要计时器,因为我希望打印在特定事件之后进行。

这就是对我有用的窍门,我希望其他人也觉得它有用:

import sys

def replace_cmd_line(output):
    """Replace the last command line output with the given output."""
    sys.stdout.write(output)
    sys.stdout.flush()
    sys.stdout.write('
')
    sys.stdout.flush()

解决方案 11:

是的,这个问题是 11 年前问的,但很酷。我喜欢即兴发挥。补充一下 nosklo 的回答:

import sys
import time

def restart_line():
    sys.stdout.write("
")
    sys.stdout.flush()

string_one = "some data that is very long..."
sys.stdout.write(string_one)
sys.stdout.flush()

time.sleep(2)
restart_line()

string_two = "shorter data"
if len(string_two) < len(string_one):
    string_two = string_two+(" "*int((len(string_one)-len(string_two))))
    # This will overwrite the characters that would be left on the console

sys.stdout.write(string_two)
sys.stdout.flush()
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2079  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1459  
  建筑行业正处于数字化转型的关键时期,建筑产品生命周期管理(PLM)系统的实施对于提升项目效率、质量和协同性至关重要。特别是在 2025 年,基于建筑信息模型(BIM)的项目进度优化工具成为众多建筑企业关注的焦点。这些工具不仅能够整合项目全生命周期的数据,还能通过精准的分析和模拟,为项目进度管理提供强大支持。BIM 与建...
plm是什么软件   0  
  PLM系统开发的重要性与现状PLM(产品生命周期管理)系统在现代企业的产品研发、生产与管理过程中扮演着至关重要的角色。它贯穿产品从概念设计到退役的整个生命周期,整合了产品数据、流程以及人员等多方面的资源,极大地提高了企业的协同效率和创新能力。通过PLM系统,企业能够实现产品信息的集中管理与共享,不同部门之间可以实时获取...
国产plm软件   0  
  PLM(产品生命周期管理)系统在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和技术的飞速发展,企业对PLM系统的迭代周期优化需求日益迫切。2025年敏捷认证对项目管理提出了新的要求,其中燃尽图作为一种强大的可视化工具,在PLM系统迭代周期优化中有着广泛且重要的应用。深入探讨这些应用,对于提升企业的项...
plm系统主要干什么的   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用