有没有办法在 Python 中模拟后台控制台活动?

Posted

技术标签:

【中文标题】有没有办法在 Python 中模拟后台控制台活动?【英文标题】:Is there a way to simulate background console activity in Python? 【发布时间】:2021-10-19 12:27:34 【问题描述】:

我可能用奇怪的方式表达了标题,但基本上我希望控制台显示:

'正在加载...'

点循环的地方,在同一行。

    '正在加载' '正在加载。' '正在加载..' '正在加载...'

我的想法是有四个不同的字符串,打印一个,清除行,打印下一个,等等。

这可以在 Python 中实现吗?也许使用 Windows 控制台命令?

谢谢

【问题讨论】:

你想做什么,更一般地说?为什么要模拟控制台活动? 这能回答你的问题吗? How to manipulate cmd.exe from python, so that the output is shown in the cmd.exe window 使用\r而不是\n,您可以移动到行首并在同一位置再次写入print("Loading", end="\r")print("Loading.", end="\r")。或者简单地使用print(".", end="")Loading 之后写点而不用清理线。 【参考方案1】:

看到这个: Python Progress Bar

您可以使用进度条,看起来更好(摘自链接) 链接中的代码示例:

from time import sleep
from tqdm import tqdm
for i in tqdm(range(10)):
    sleep(3)

 60%|██████    | 6/10 [00:18<00:12,  0.33 it/s]

【讨论】:

【参考方案2】:

如果您在print() 中使用end="\r",则它不会转到下一行,但会移至行首 - 然后您可以在同一行再次写入。

import time

print("Loading", end="\r")
time.sleep(1)
print("Loading.", end="\r")
time.sleep(1)
print("Loading..", end="\r")
time.sleep(1)
print("Loading...", end="\r")
time.sleep(1)

print()  # move to next line

当您必须更改行中的文本时,这会很有用。 但是对于添加点,使用end="" 在同一行写入会更简单

import itme

print("Loading", end="")

for _ in range(3):
    time.sleep(1)
    print(".", end="")

print()  # move to next line

部分模块使用此方法绘制progressbar


顺便说一句:

您也可以\rend="" 将光标保持在行尾

import time

print("\rLoading", end="")
time.sleep(1)
print("\rLoading.", end="")
time.sleep(1)
print("\rLoading..", end="")
time.sleep(1)
print("\rLoading...", end="")
time.sleep(1)

print()  # move to next line

如果新文本比旧文本短,则应在末尾写空格以删除以前的文本。

import time

print("\r....", end="")
time.sleep(1)
print("\r... ", end="")
time.sleep(1)
print("\r.. ", end="")
time.sleep(1)
print("\r. ", end="")
time.sleep(1)
print("\r ", end="")

print()  # move to next line

如果您想同时显示其他文本,则可能需要使用curses、urwind、npyscreen 等模块,该模块可以使用特殊代码将光标移动到(某些)终端的不同位置。

【讨论】:

以上是关于有没有办法在 Python 中模拟后台控制台活动?的主要内容,如果未能解决你的问题,请参考以下文章

在Xcode中使用GPX模拟位置变化时,有没有办法控制速度?

Python模拟浏览器实现用户响应

有没有办法在推送通知接收时将应用程序带到前台?

python 窗口操作

来自后台时iOS App UI冻结

python:如果后台线程处于活动状态,则不会运行weakref.finalize