2016-05-31 6 views
2

Существует много вопросов, связанных с печатью на одной строке, но нет необходимости печатать несколько строк в одной строке терминала.Распечатка командной строки Python в тех же строках

Например:

[email protected]:~|⇒ python my_script.py 
Process 1: 5% 
Process 2: 14% 
Process 3: 55% 

Я хочу, чтобы развитие этих процессов обновления на той же строке, а не печать снова и снова. Я рассмотрел другие вопросы, которые говорят использовать символ возврата каретки \r и sys.stdout.flush(), но, похоже, он не изменяет каретку, чтобы подняться по линии, вплоть до конца текущей строки.

EDIT: Мой вопрос отличается от того, что он связан с печатью многострочных строк на тех же строках в терминале. Это легко, если это всего лишь одна строка.

+0

пожалуйста разделяет фрагмент кода, чтобы посмотреть, как вы регулируете это от my_script.py – glls

+2

Возможного дубликата [Python - переписать несколько строк в консоли] (http://stackoverflow.com/questions/6840420/python -rewrite-multiple-lines-in-the-console) – schwobaseggl

+0

Разумным решением является то, что ваш контрольный процесс собирает информацию о состоянии и печатает его. – pvg

ответ

1

Один из подходов заключается в использовании ANSI escape-code"\033[F" для перехода к началу предыдущей строки. Следующие хорошо работали во всех своих терминалах, просто писать на следующие две строки из текущего местоположения терминала:

import time 
import sys 

progress_1 = 'Process 1: {}%' 
progress_2 = 'Process 2: {}%' 
print 
print 

for i in range(100): 
    sys.stdout.write('\033[F') 
    sys.stdout.write('\033[F') 
    print(progress_1.format(i)) 
    print(progress_2.format(i)) 
    time.sleep(0.02) 
+0

Это дает мне странный результат, когда я запускаю его. Некоторые из заявлений на печать записываются выше моей основной линии терминала. – Ogen

+0

Затем очистка экрана не работает. Я предполагаю, что вы не работаете в Linux. – schwobaseggl

+0

Я нахожусь на Mac. Независимо от того, что я не хочу, чтобы экран был очищен, есть ли способ обойти это – Ogen

0

для Python 2.7 вы можете использовать,

print 2%, 3% # Using comma will print it in same line 

для питона 3.x

print('2%', end=" ") 

Или вы можете использовать sys.stdout.write для выполнения его sys.stdout.flush() Пожалуйста, проверьте мой код ниже, я создал бар демонстрационного прогресса.

"""ProgressBar Module.""" 

import sys 
import time 


class ProgressBar(object): 
    """Main class for the ProgressBa.""" 

    DEFAULT_BAR_LENGTH = float(30) 

    def __init__(self, start=0, step=1): 
     """Init for the class.""" 
     self.end = ProgressBar.DEFAULT_BAR_LENGTH 
     self.start = start 
     self.step = step 
     self.total = self.end - self.start 
     self.counts = self.total/self.step 
     self._barLength = ProgressBar.DEFAULT_BAR_LENGTH 

     self.set_level(self.start) 
     self._plotted = False 

    def set_level_old(self, level, initial=False): 
     """Setting Level.""" 
     self._level = level 
     if level < self.start: 
      self._level = self.start 
     if level > self.end: 
      self._level = self.end 

     self._ratio = float(
      self._level - self.start)/float(self.end - self.start) 
     self._levelChars = int(self._ratio * self._barLength) 

    def set_level(self, level, initial=False): 
     """Setting Level.""" 
     self._level = level 
     if level < self.start: 
      self._level = self.start 
     if level > self.end: 
      self._level = self.end 

     self._ratio = float(self._level)/float(self._barLength) 
     self._levelChars = int(self._ratio * self._barLength) * self.step 

    def plot_progress(self): 
     """Plotting the bar.""" 
     sys.stdout.write("\r %3i%% |%s%s|" % (
      int(self._ratio * self.step * 100.0), 
      u'\u2588' * int(self._levelChars), 
      ' ' * int(self._barLength - self._levelChars), 
     )) 
     sys.stdout.flush() 
     self._plotted = True 

    def set_and_plot(self, level): 
     """Call the plot.""" 
     old_chars = self._levelChars 
     self.set_level(level) 
     if (not self._plotted) or (old_chars != self._levelChars): 
      self.plot_progress() 

    def __del__(self): 
     """Del for the class.""" 
     sys.stdout.write("\n") 

if __name__ == "__main__": 

    pb = ProgressBar(0, 1) 

    curProgress = 0 
    pb.plot_progress() 
    while curProgress <= pb.counts: 
     pb.set_and_plot(curProgress) 
     curProgress += 1 
     time.sleep(0.1) 

    del pb 
0

Это можно легко сделать, используя обратное пространство. Ниже приведен пример кода, который будет печатать процент в той же строке.

import time 
print "Work in progress(0%%)", # Python 2 print without newline 
for work_done in range(10): 
    print "\b\b\b\b\b%2d%%)" % work_done, # Backspace then overwrite 
    time.sleep(1) 
+0

Это не то, что я хочу – Ogen