Win7里python调用you-get时cmd的进度条多行

前言全局说明

最近在 Win7 下使用Python调用you-get下载时,进度条总是显示多行,虽然不影响下载,
但是会把一些有用信息顶到上面,还要拖动滚动条查看,不方便。所以趁着有点时间,看看源码是怎么写的。

如下图一样的多行问题:
图片


一、说明

1.1 调试环境:

Windows 7 旗舰版 SP1
Python 3.8.10 (tags/v3.8.10:3d8993a, May  3 2021, 11:48:03) [MSC v.1928 64 bit (AMD64)] on win32
you-get            0.4.1743
cmd Microsoft Windows [版本 6.1.7601]

二、查找模块位置

知道路径的可忽略此步

>>> import you_get
>>> print(you_get.__file__)

注意:you_get 的 you 和 get 中间是下划线

显示路径:C:\Python3810\DLLs\lib\site-packages\you_get_init_.py
图片


三、测试cmd终端

测试cmd终端是否支持\r(回到行首)

3.1 使用deepseek给出的测试代码

文件名:test.py

import sys
import time

# 测试1:基本 \r 功能
for i in range(101):
    sys.stdout.write(f'\r测试进度: {i}%'.ljust(50))
    sys.stdout.flush()
    time.sleep(0.05)
print('\n测试1完成')

for i in range(101):
    bar = f'{i:>6.1f}% ({i/10:.1f}/10.0MB) [{"█"*int(i/10)}{">" if i%10>5 else ""}] [1/1] 1.2 MB/s'
    sys.stdout.write('\r' + bar.ljust(80))
    sys.stdout.flush()
    time.sleep(0.05)
print('\n测试2完成')

结果:都测试通过,说明CMD自身支持\r

图片


四、问题分析

4.1 查看您源代码

打印相关的源码路径在:
C:\Python3810\DLLs\lib\site-packages\you_get\common.py
class类SimpleProgressBar的update()函数中
图片

4.2

问 Deepseek 时,都是说让修改很多代码,而且修改后也没有效果。
先说是\n导致的,但是看源码 self.bar 变量里格式化的内容,并没有\n。
用AI提示的修改了好几处代码都没有效果,心想,不能全听AI的,还是仔细研究代码吧。
虽然打印多行,但是已经打印的行,没有错误,说明对终端宽度获取是对的(通过打印__init__ 的值,也能确认这点)

4.3 发现问题

回看打印出进度条界面的时候,发现最后一行有个s 应该是上一行缓冲区没打印完的。然后回看代码。
图片

翻看代码时,看到计算行打印内容的self.bar_size 的变量,看计算公式,
既然是多出一个字符,那就把行加一个字符
图片

将28改29
改完效果,成功了
图片

你肯定在想,别的行怎么没有多打印出s,是因为\r在当前行生效,从头开始打印给覆盖了。

五、解决方法

将 common.py 文件里,第852行的28改成29

5.1 改之前:

图片

5.2 改之后:

图片



免责声明:本号所涉及内容仅供安全研究与教学使用,如出现其他风险,后果自负。




参考、来源:
https://chat.deepseek.com/a/chat/s/f65ae2c6-3a06-497d-9c03-1334e3ccc52e
https://chat.deepseek.com/a/chat/s/e31e3525-0fef-4b30-838e-a010f4298b8d



posted @ 2026-09-09 17:19  悟透  阅读(10)  评论(0)    收藏  举报