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

2025-03-25 08:47:00
admin
原创
33
摘要:问题描述:在 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大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2482  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1533  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   0  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   0  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用