2015-06-20 4 views
4

У меня есть команда управления Django, которая выполняет довольно немного обработки, поэтому у меня есть вывод ее прогресса в процентах. Я хотел бы использовать технику, как описано в ответах here или here. Я знаю from the Django docs, что sys.stdout необходимо заменить на self.stdout при использовании внутри команды управления, но мне все еще не повезло. Это python 2.7, поэтому я не могу дать end kwarg до print. Вот одна из вещей, которые я пробовал в handle объекта Command:Динамический однострочный вывод в команде управления Django

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

Я попробовал несколько других методов, описанных в ответах на подобные вопросы, в том числе с использованием ANSI escape sequences. Есть ли что-то особенное в том, как команды управления Django выводят вывод? Как я могу добиться эффекта, который я ищу?

ответ

1

Т.Л., д-р

выход стандартный вывод в буфер по умолчанию, поэтому вровень вручную:

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) 

Reference

я следовал this issue, что кто-то открыл несколько лет назад, и this SO thread; см. как для более подробной информации, так и для других решений, таких как python -u option.

+0

Спасибо за это! я делал 'write' с' end = '\ r'' без 'flush()' и вытягивал мои волосы! – theannouncer

Смежные вопросы