关于Termux使用you-get下载B站报错ValueError: Sign not allowed in string format specifier解决方案

目录

    • 前言(都是废话,想看最终结果自己跳转到总结)
    • 环境介绍
    • 过程分析
      • 方案1
      • 方案2
    • 总结

前言(都是废话,想看最终结果自己跳转到总结)

说起来挺离谱的,我用Termux挺长时间了,曾经用you-get下载B站视频都是无往不利的,但最近更新you-get后下载B站视频就莫名其妙报错,而用电脑下就毫无压力,这能忍吗?当然不能,所以我决定和这个bug一刚到底。最后的解决方案也是让我当场破防,无语凌噎。

环境介绍

Termux版本:0.118.0
you-get版本:0.4.1612
报错代码:

ValueError: Sign not allowed in string format specifier

** 小贴士 **
查看you-get报错方式:在you-get命令后加--debug(注意空格)
举例:
you-get --debug 视频网址

关于Termux使用you-get下载B站报错ValueError: Sign not allowed in string format specifier解决方案_第1张图片

过程分析

方案1

当我看见这个关于format报错的时候,我就直接打算打开you-get相关的源码看看,根据报错:输入vim /data/data/com.termux/files/usr/lib/python3.10/site-packages/you_get/common.py并跳转到869行。
以下为那一行报错代码所在函数的具体代码:

def update(self):
        self.displayed = True
        bar_size = self.bar_size
        percent = round(self.received * 100 / self.total_size, 1)
        if percent >= 100:
            percent = 100
        dots = bar_size * int(percent) // 100
        plus = int(percent) - dots // bar_size * 100
        if plus > 0.8:
            plus = '█'
        elif plus > 0.4:
            plus = '>'
        else:
            plus = ''
        bar = '█' * dots + plus
        # 下面这一行代码报错
        bar = self.bar.format(
            percent, round(self.received / 1048576, 1), bar,
            self.current_piece, self.total_pieces, self.speed
        )
        sys.stdout.write('\r' + bar)
        sys.stdout.flush()

通过它给出的变量和前后对比,不难看出,这不就是进度条嘛,第一个解决方案就立刻出来了,直接把报错的那一行代码注释掉就完工了。果不其然,注释掉后能下载视频了
** 注释代码后的函数 **
关于Termux使用you-get下载B站报错ValueError: Sign not allowed in string format specifier解决方案_第2张图片
** 注释代码后的运行截图 **
关于Termux使用you-get下载B站报错ValueError: Sign not allowed in string format specifier解决方案_第3张图片
能跑了,但是进度条坏了,并不完美。

方案2

没有进度条这种事情下短视频还好,长视频就难受了,都不知道下载到哪了,所以我放弃了方案1,进而我又去查了一下错误代码所指向的那个format字符串的源代码,又想到报错的内容

self.bar = '{:>4}%% ({:>%s}/%sMB) ├{:─<%s}┤[{:>%s}/{:>%s}] {}' % (
            total_str_width, total_str, self.bar_size, total_pieces_len,            total_pieces_len        )

看见这个字符串后我想到了一个很离谱的方式,把字体缩小,说不一定就能显示了呢?然后我测试了一下,还真成了,这就很离谱。
** 字体缩小后的下载显示 **
关于Termux使用you-get下载B站报错ValueError: Sign not allowed in string format specifier解决方案_第4张图片
** 小贴士:字体放大缩小方式 **
关于Termux使用you-get下载B站报错ValueError: Sign not allowed in string format specifier解决方案_第5张图片
到这里,基本可以肯定解决方案了,这个报错是内容显示不全导致的,只要适当缩小字体,就能解决这个问题(不用像我这样缩小的这么小)。

总结

解决方案就是缩小字体(缩小字体的方式上面那个动图展示的),小到能显示进度条就行。
如果实在不行,就把报错的那一行注释掉(具体注释内容看过程分析的方案1),没进度条,就肯定不能报错了。
最后我只想说报错并不可怕,可怕的是不想思考。

你可能感兴趣的:(经验分享,python)