我正在尝试为称为windscribe-cli的VPN程序编写GUI。我需要区分VPN是否已连接。
windscribe状态的结果如下:
windscribe-pid:1479,状态:正在运行,正常运行时间:1h 50m,%cpu:0.0, %mem:0.4 IP:143.159.73.130断开
DISCONNECTED用红色书写。
我无法从if或elif得到彩色文字的结果。
我曾尝试使用if elif,但是它们忽略了彩色书写。 使用print word_list [14]输出彩色单词。
import sh
def status():
status = ""
windscribe_status = sh.windscribe("status")
word_list = windscribe_status.split()
if word_list[14] == "CONNECTED":
status = "connected"
elif word_list[14] == "DISCONNECTED":
status = "disconnected"
return status
print status()
我希望看到连接或断开连接,但什么也看不到。
答案 0 :(得分:1)
如果我是你,我不会围绕这种色彩。 windscribe
可能是一个例外(这并不罕见),但是cli程序通常在写出终端转义符以更改颜色之前先检查其输出是否为终端设备。 this blog post是用python示例向终端写入 write 彩色数据的示例,但是应该很好地用于了解颜色代码背后的机制以及为什么您的单词与您期望的不符至。因此,可能最好忽略颜色。
坦率地说,使用状态消息也不理想。这些对于人类消耗的状态通常无法随时间提供足够一致的行为以提供非常可靠的界面。许多程序将以更加程序友好的方式公开其状态-可能是您可以从中读取状态的套接字,文件或对cli程序的不同调用。但也许不是-取决于程序。通常,开放源代码程序包含此类功能,因为其开发人员通常在CLI编程领域经验丰富-专有代码较少。但是,嗯。
无论如何,尽管如此,您的问题还是这样:
word_list = windscribe_status.split()
这将在空格上分开,但不会排除彩色输出周围的颜色代码。实际上,通过执行以下操作,您可以使您的程序在更改状态消息时更加健壮,并且更加简单:
if "disconnected" in winscribe_status.lower():
handle disconnected
elif "connected" in winscribe_status.lower():
handle connected
在这里,我使用in
检查一个子字符串;并且我使用lower()
使自己免受将来对大写字母的更改(这不是绝对必要的,但是如果大写字母发生变化,这似乎是值得做的事情。)
这是该步骤的完整示例,其中删除了您的详细信息:
import subprocess
test_inputs = [
"I AM DISConnected!",
"\033[1;31mDISCONNECTED\033[0m",
"Successfully \033[1;32mConnected\033[0m"
]
for cmd in test_inputs:
res = subprocess.check_output(["echo",'-n',cmd])
res = str(res)
print("Message was: '{}'".format(res))
if 'disconnected' in res.lower():
print('Disconnected!')
elif 'connected' in res.lower():
print('Connected!')
我这样跑。 Pyhton3的输出看起来有些不同,但是逻辑仍然有效。
$ python ./t.py
Message was: 'I AM DISConnected!'
Disconnected!
Message was: 'DISCONNECTED'
Disconnected!
Message was: 'Successfully Connected'
Connected!
在这里,单词的顺序无关紧要,它们的编号或大小写也无关紧要,并且无论有无颜色,它都可以忽略不计。顺序很重要;显然,“已连接”匹配任何“已断开”匹配。