Linux下Python实现打印行旁动态光标动画随子进程结束停止的问题
解决子进程运行时旋转动画无法停止的问题
嘿,这个问题我之前踩过坑!核心矛盾在于主线程没法同时兼顾动画刷新和等待子进程结束——subprocess.call是阻塞式的,会卡住主线程;要是先写动画循环,又没法中途停下来触发子进程。用线程分离就能完美破解这个困境,让动画在后台独立运行,子进程结束后再精准终止动画。
下面是完整的解决方案代码,我给你标了关键注释:
import subprocess import threading import time import sys # 控制动画启停的标志位 stop_animation = False def spinning_animation(): # 旋转光标序列 cursor_chars = '/|\\-' while not stop_animation: for char in cursor_chars: # 用\r回到行首,覆盖之前的输出,实现不换行的动画效果 sys.stdout.write(f'\rRunning this command {char}') # 强制刷新输出缓冲,避免动画卡顿 sys.stdout.flush() time.sleep(0.1) # 每次循环检查标志,防止子进程结束后还跑一轮动画 if stop_animation: break # 动画结束后,清除当前行的动画内容,打印完成提示 sys.stdout.write('\rRunning this command ✅ Done!\n') sys.stdout.flush() for i in range(1, 10): # 重置动画标志 stop_animation = False # 启动动画线程 anim_thread = threading.Thread(target=spinning_animation) anim_thread.start() # 运行你的子进程,这里用sleep 2模拟耗时命令,替换成你实际的xterm命令即可 subprocess.call(["xterm", "-e", "sleep 2"]) # 子进程结束,触发停止动画的标志 stop_animation = True # 等待动画线程完全结束,再进入下一次循环 anim_thread.join()
关键细节说明:
- 线程分离:把动画逻辑放到单独线程,主线程阻塞在
subprocess.call时,动画线程仍能持续更新光标 \r的妙用:回车符让光标回到行首,新的光标符号会覆盖旧的,不会产生大量换行- 强制刷新输出:
sys.stdout.flush()必须加,否则控制台会攒着输出一起打印,动画会变成卡顿的跳变 - 标志位控制:
stop_animation用来通知动画线程停止循环,确保子进程结束后动画立刻终止
这样修改后,每次xterm窗口关闭(子进程结束),动画会马上停止,然后自动进入下一次循环,完全解决你当前的问题!
内容的提问来源于stack exchange,提问作者j_pentester
相关产品推荐
相关产品推荐

