从命令行检查结果时使用 if 语句

Using if statement when examining results from command line

我正在尝试为名为 windscribe-cli 的 VPN 程序编写 GUI。我需要区分是否连接了VPN
windscribe 状态的结果如下:

windscribe -- pid: 1479, status: running, uptime: 1h 50m, %cpu: 0.0, %mem: 0.4 IP: 143.159.73.130 DISCONNECTED

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()

我希望看到连接或断开连接,但什么也没看到。

如果我是你,我不会围绕着色来构建它。 windscribe 可能是一个例外(并不少见),但 cli 程序通常会在写出终端转义符以更改颜色之前检查其输出是否为终端设备。 this blog post 是用 python 示例 彩色数据写入终端编写的,但对于了解颜色代码背后的机制以及为什么你的词不'符合您的期望。所以可能最好忽略颜色。

坦率地说,使用状态消息也不理想。这些用于人类消费的状态通常无法随着时间的推移提供足够一致的行为来提供非常可靠的界面。许多程序会以一种对程序更友好的方式公开它们的状态——可能是一个套接字,您可以从中读取状态,或者是一个文件,或者是 cli 程序的不同调用。但也许不是 - 取决于程序。通常开源程序包含这些功能,因为他们的开发人员通常在 CLI 编程方面经验丰富 space - 专有代码,更少。但是ymmv.

无论如何,尽管如此,你的问题是:

word_list = windscribe_status.split()

这将在 spaces 上拆分,但不会排除彩色输出周围的颜色代码。实际上,你可以让你的程序在面对不断变化的状态消息时更健壮,也更简单,方法如下:

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!",
  "3[1;31mDISCONNECTED3[0m",
  "Successfully 3[1;32mConnected3[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!

在这里,单词的顺序、数量或大小写都无关紧要,无论有没有颜色,它都会忽略它。顺序很重要;显然 'connected' 将匹配 'disconnected' 匹配的任何地方。