Печатать индикатор выполнения командной строки по горизонтали

#!/usr/bin/python
import time

count  = 5
temp = True
while temp:
        if count < 1:
                print "done",
                temp = False
        else:
                print "*"
                time.sleep(2)
                count -= 1

выход:

*
*
*
*
*
done

Обратите внимание, что здесь «*» в выводе печатается один за другим на экране с интервалом в 2 секунды (это именно то, что я хотел), мне нужно использовать это как индикатор выполнения в каком-то другом коде.

  1. Я использовал print "*",, однако вывод горизонтальный, но он печатает все сразу после выполнения программы.

    >>>* * * * * done
    
  2. использование ключевого слова end дает эту ошибку.

    File "progress_1_.py", line 11
     print ("*",end = '')
                        ^
    SyntaxError: invalid syntax
    

Версия Python — Python 2.7.5.

Я не могу обновить Python на этой рабочей машине, и мне нужно иметь дело с существующей версией, чтобы получить желаемый результат.

Итак, учитывая приведенные выше случаи, вместо того, чтобы печатать в новой строке, можно ли печатать горизонтально один за другим с интервалом в 2 секунды?


person chetan honnavile    schedule 04.05.2016    source источник
comment
Вы должны установить 2.x локально, чтобы вы могли писать и тестировать код, который действительно будет работать в рабочей среде, но учтите, что вы можете from __future__ import print_function.   -  person jonrsharpe    schedule 04.05.2016
comment
@chetan, я попробовал ваш код, как показано ниже, и он работает, как и ожидалось. Код, который я использовал: import time count = 5 temp = True while temp: if count ‹ 1: print done, temp = False else: print *, time.sleep(2) count -= 1   -  person pmaniyan    schedule 04.05.2016
comment
Тем не менее, я добавил запятую в печати *   -  person pmaniyan    schedule 04.05.2016
comment
Не забудьте принять ответ, который помог вам больше всего, щелкнув значок серой галочки слева от него. Это помечает ваш вопрос как решенный, а также награждает отвечающего несколькими баллами. Спасибо!   -  person Byte Commander    schedule 04.05.2016
comment
Запустите код как скрипт Python с запятой после печати *, это должно решить проблему.   -  person pmaniyan    schedule 04.05.2016


Ответы (3)


Вот один простой ответ:

#!/usr/bin/python

import sys
import time

def wait(n):
    time_counter = 0
    while True:
        time_counter += 1
        if time_counter <= n:
            time.sleep(1)
            sys.stdout.write("*")
            sys.stdout.flush()
        else:
            break
    sys.stdout.write("\n")
wait(10)

Output:

**********

Вы можете изменить так, как хотите.

person James    schedule 04.05.2016

Оператор print в Python 2 не такой гибкий, как функция в Python 3.

Если бы вы использовали Python 3, вы могли бы просто указать конечный символ и нужно ли сразу сбрасывать буфер следующим образом:

print("*", end="", flush=True)

Однако, поскольку вы используете Python 2, вы не можете использовать оператор print, но должны напрямую обращаться к объекту выходного потока:

import sys
def progress_print(character="*"):
     sys.stdout.write(character)
     sys.stdout.flush()

Это заставит Python не кэшировать данные печати, пока не будет завершена одна строка, а отображать их немедленно, очищая буфер.

person Byte Commander    schedule 04.05.2016

Вы можете пропустить буферизацию для всего процесса Python, используя python -u

Или, когда вам нужно использовать python 2, вы также можете заменить sys.stdout каким-либо другим потоком, например, оболочкой, которая выполняет сброс после каждого вызова.

class Unbuffered(object):
   def __init__(self, stream):
       self.stream = stream
   def write(self, data):
       self.stream.write(data)
       self.stream.flush()
   def __getattr__(self, attr):
       return getattr(self.stream, attr)

import time
import sys
sys.stdout = Unbuffered(sys.stdout)
print '*',
time.sleep(2)
print '*'
person salomonderossi    schedule 04.05.2016