Странное цветовое поведение python

У меня есть следующие данные:

localhost is alive
54.197.204.2 is alive
danezu4 172.31.24.178 Disk usage: 14602mb RAM available: 1837mb Uptime: 255mins CPULoad: 0.0% 
danezu1 172.31.32.230 Disk usage: 14962mb RAM available: 1837mb Uptime: 255mins CPULoad: 0.0% 
danezu4 172.31.24.178 Disk usage: 14602mb RAM available: 1837mb Uptime: 255mins CPULoad: 0.0% 
danezu1 172.31.32.230 Disk usage: 14962mb RAM available: 1837mb Uptime: 255mins CPULoad: 0.0%

И следующий код Python:

import colour
import fileinput
class Colour:
   GREEN = '\033[92m'
   RED = '\033[91m'
   BOLD = '\033[1m'
   END = '\033[0m'
uptime="Uptime:"
cpuload="CPULoad:"
f=open('/home/ansible/ansible/playbooks/healthcheckv2/sysinfo/files/ping.txt', 'r')
filedata=f.read()
f.close()
with open('/home/ansible/ansible/playbooks/healthcheckv2/sysinfo/files/ping.txt', 'r') as f:
   for line in f:
       words=line.split()
       for i,w in enumerate(words):
          if w==uptime:
               if words[i+1]>86400:
                   filedata=filedata.replace(words[i+1], Colour.GREEN+words[i+1]+Colour.END)
               elif words[i+1]<86399:
                   filedata=filedata.replace(words[i+1], Colour.RED+words[i+1]+Colour.END)
          if w==cpuload:
               if words[i+1]>80:
                   filedata=filedata.replace(words[i+1], Colour.RED+words[i+1]+Colour.END)
               elif words[i+1]<79.99:
                   filedata=filedata.replace(words[i+1], Colour.GREEN+words[i+1]+Colour.END)
with open('/home/ansible/ansible/playbooks/healthcheckv2/sysinfo/files/ping.txt', 'w') as file:
     file.write(filedata)
file.close()

Я не понимаю, как изменится цвет текста после применения этого кода Python. Если ЦП в текстовом файле ниже 80, значение будет КРАСНЫМ. Если значение в текстовом файле проходит 80%, будет зеленым. То же самое относится и к значению времени безотказной работы. Что тут может быть не так?

Значения, которые находятся в текстовом файле, округлены в файле шаблона Jinja2 (но я не думаю, что поведение связано с этим):

Uptime: {{(ansible_uptime_seconds/60)|round|int}}mins CPULoad: {{(cpuload.stdout)|float|round}}% 

С наилучшими пожеланиями,

Ромен

0
0
43
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

РЕДАКТИРОВАТЬ: Думаю, я неверно истолковал вопрос, означающий, что вы не понимаете escape-последовательности.

Если вы не понимаете, почему цвета применены неправильно, вот почему:

if words[i+1]>86400:

Вы сравниваете строку с целым числом.

if float(words[i+1][:-4])>86400:

Это отрежет «минуты» от времени безотказной работы, а остальное преобразует в число с плавающей запятой.

Аналогичным образом if float(words[i+1][:-1])>80: позволяет сравнивать проценты с числами.

Также, поскольку 0,0% находится в нескольких строках, функция replace может не подходить лучше всего для ваших нужд, поскольку ist форматирует каждое появление 0,0% сразу и трижды из-за цикла.


Первый ответ

Вы никогда не используете здесь модуль colour.

Определенный класс Colour имеет четыре значения, которые являются строками для Терминальные Escape Sequences (ссылка).

The ANSI/VT100 terminals and terminal emulators are not just able to display black and white text; they can display colors and formatted texts thanks to escape sequences. Those sequences are composed of the Escape character (often represented by "^[" or "Esc") followed by some other characters: "Esc[FormatCodem". (source)

Colour.RED - это просто замена строки '\033[91m', возможно, чтобы сделать код более разборчивым.

Эта строка интерпретируется эмулятором терминала и меняет цвет следующих символов на красный. Строка, представленная Colour.END, возвращает вывод к значениям по умолчанию.

cat ping.txt после применения скрипта показывает интерпретируемый файл в терминале с цветами, которые вы наблюдали.

Если я применю ваше предложение к if float(words[i+1][:-1])>80:, я получу следующее: if float(words[i+1][:-1])>80: ValueError: could not convert string to float: 0.0

Romain 11.04.2018 14:21

хм, я не понимаю, как он не смог бы преобразовать '0.0' ... вы также можете попробовать наоборот, то есть преобразовать обе стороны в строки, но вам нужно будет позаботиться о том, чтобы строки были одинаково длинными ( с десятичной точкой в ​​одной и той же точке) и заполнены нулями, чтобы избежать сравнения между пробелами и нулями. if "{:0>6.6s}".format(words[i+1])>"080.0%" или что-то в этом роде

polymachine 11.04.2018 15:17

Другие вопросы по теме