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

ste*_*ett 6 python printing django

我有一个执行大量处理的Django管理命令,因此我将其进度输出为一个百分比。我想使用此处此处答案中所述的技术。我从Django文档中知道,在管理命令中使用Django时sys.stdout需要将其替换self.stdout,但是我仍然没有运气。它是python 2.7,所以我不能将endkwarg设置为print。这是我尝试过handle的Command对象之一:

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

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

tut*_*uju 7

tl; dr

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

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)
Run Code Online (Sandbox Code Playgroud)

参考

我遵循了几年前有人打开的这个问题,以及这个SO线程;请参阅以获得更多详细信息和其他解决方案,例如python -u option

  • 谢谢你!我一直在用 `ending='\r'` 做 `write` 而没有 `flush()` 并把我的头发拉出来! (2认同)