Django 管理命令中的动态单行输出



我有一个 Django 管理命令,它做了相当多的处理,所以我让它以百分比形式输出它的进度。我想使用此处或此处答案中描述的技术。我从 Django 文档中知道,在管理命令中使用时,sys.stdout需要用 self.stdout 替换,但我仍然没有运气。这是python 2.7,所以我不能把end kwarg交给print.这是我在handle Command 对象时尝试过的事情之一:

i = 0
for thing in query:
    self.stdout.write("r%%%s" % (100 * float(i) / float(query.count()))
    i += 1

我尝试了类似问题解答中描述的其他几种技术,包括使用 ANSI 转义序列。Django 管理命令打印输出的方式有什么特别之处吗?如何实现我想要的效果?

tl;dr

默认情况下,标准输出输出是缓冲的,因此请手动刷新:

import time
from django.core.management.base import BaseCommand
class Command(BaseCommand):
    help = "My shiny new management command."
    def handle(self, *args, **options):
        self.stdout.write("Writing progress test!")
        for i in range(100):
            self.stdout.write("%{}".format(i), ending='r')
            self.stdout.flush()
            time.sleep(0.01)

参考

我关注了几年前有人打开的这个问题,以及这个SO线程;请参阅更长的详细信息和其他解决方案,例如python -u选项。

最新更新