奇怪的颜色行为Python

时间:2018-04-11 10:48:49

标签: python colors jinja2

我有以下输入:

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代码后,我不理解文本颜色的行为。如果文本文件中的CPU低于80,则该值将为RED。如果值在文本文件中传递80%,则为绿色。同样的事情是申请正常运行时间价值。这可能有什么不对?

文本文件中的值在Jinja2模板文件中被舍入(但我不认为行为与此相关):

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

致以最诚挚的问候,

罗曼

1 个答案:

答案 0 :(得分:1)

编辑:我认为我误解了这个问题,意味着你不理解转义序列。

如果你不明白为什么这些颜色应用错误,原因如下:

if words[i+1]>86400:

您正在将字符串与整数进行比较。

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

这将切断&#34;分钟&#34;形成正常运行时间并将其余部分转换为浮点数。

同样if float(words[i+1][:-1])>80:允许将百分比与数字进行比较。

同样,因为0.0%在多行中被处理,replace函数可能不是最适合您的需求,因为ist格式化每次出现的&#39; 0.0%&# 39;由于循环,立刻和三次结束。

第一个回答

你从不在这里使用colour模块。

定义的类Colour有四个值,即terminal Escape Sequences (link)的字符串。

  

ANSI / VT100终端和终端仿真器不仅能够显示黑白文本;由于转义序列,它们可以显示颜色和格式化文本。这些序列由Escape字符组成(通常由&#34; ^ [&#34;或&#34; Esc&#34;表示),后跟一些其他字符:&#34; Esc [FormatCodem&#34;。   (source)

Colour.RED只是字符串'\033[91m'的替身,可能会使代码更清晰。

此字符串由终端仿真器解释并更改以下字符&#39;颜色为红色。由Colour.END表示的字符串将输出恢复为默认值。

应用脚本后,

cat ping.txt在终端中显示解释后的文件,并显示您所遵循的颜色。