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
浙公网安备 33010602011771号