我写了这个简单的python代码,因为我想为我创建一些进度条模块,并在buffor中'for'期间抓取打印数据,让我在循环期间打印值,即使我使用像tqdm()这样的栏 . 终端一切正常 .
import builtins
import sys
import os
def prgssb(container):
# Defines length of the progress bar
prgssb_len = 10
class ContainerWithBar:
def __init__(self, container_to_copy):
self.container_len = len(container)
self.index = 0
self.copy_container_iter = iter(container_to_copy)
self.print_buffor = []
# Overrides the built-in 'print' function
self.print_bar = builtins.print
builtins.print = self.add_to_buffor
def __iter__(self):
return self
def __next__(self):
# Normalize the built-in 'print' function and prints content the buffor
if self.index == self.container_len:
builtins.print = self.print_bar
print('\n*** Buffored data:')
for arg_data in self.print_buffor:
print(arg_data[0], end='', file=arg_data[1], flush=arg_data[2])
print('\n*** End of buffored data')
raise StopIteration
# Calculates properties of the progress bar
self.index += 1
iter_progress = round(self.index / self.container_len * prgssb_len)
percentage = round(self.index / self.container_len * 100)
element_progress_padding = 2 + len(str(self.container_len)) - len(str(self.index))
bar_content = '[' + '▓' * iter_progress + '░' * (prgssb_len - iter_progress) + ']' + f'{percentage:4d}%' + \
' ' * element_progress_padding + str(self.index) + '/' + str(self.container_len)
# Adjusts properties if script is running in the terminal
if os.isatty(0):
bar_content = '\r' + bar_content
# Prints the progress bar
self.print_bar('\b' * len(bar_content) + bar_content, end='')
return next(self.copy_container_iter)
def add_to_buffor(self, *objects, sep=' ', end='\n', file=sys.stdout, flush=False):
arg_str = ''
arg_index = 0
for arg in objects:
if arg_index == len(objects) - 1:
separator = ''
else:
separator = sep
arg_str += str(arg)
arg_str += separator
arg_index += 1
arg_str += end
arg_data = (arg_str, file, flush)
self.print_buffor.append(arg_data)
return ContainerWithBar(container)
好吧,它在pycharm终端或解释器中的另一台PC上运行良好,但是当我现在运行它时,它会变得非常奇怪 . 它在解释器中打印出额外的行,而不是删除旧栏 . 是的,没有什么有趣的,不同的终端,控制台,等等 . 但是,关键是如果我在测试函数中使用它,'\ b'字符工作得很好:
from progress_bar import prgssb
from time import sleep
a = {}
for x in range(4):
a[x] = x
for x in prgssb(a):
sleep(1)
print(x, '\b' * 2, end='')
我在这段代码中覆盖'print'函数,让它成为我想要的方式,如果有人在循环中使用它 . 如果还不够,解释器也会输出'\ b',即使我在同一个测试文件中使用我创建的方法也是如此:
from progress_bar import prgssb
from time import sleep
a = {}
for x in range(4):
a[x] = x
b = prgssb(a)
for x in b:
sleep(1)
b.print_bar(x, '\b' * 2, end='')
现在真的看起来这就是self.print_bar方法在类中 . 我不确定它是否应该像那样工作 . 我真的很喜欢通过正确显示顺利显示btw的好进度条,我不知道它是否可能,但我非常感谢这方面的任何帮助,因为我在这一点上陷入了一段时间 .
另外现在我看到这个脚本没有在pycharm python解释器中正确打印,但在cmd终端仍然没问题 . 那么使用python解释器有什么不对,为什么它在不同的PC上有这么不同的行为?