Использование оператора if при проверке результатов из командной строки - PullRequest
0 голосов
/ 27 января 2019

Я пытаюсь написать графический интерфейс для программы VPN под названием windscribe-cli.Мне нужно различать, подключен ли VPN или нет.
Результат статуса windscribe выглядит следующим образом:

windscribe - pid: 1479, статус: работает, время безотказной работы: 1h 50m,% ЦП: 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()

Я ожидаю увидеть подключенный или отключенный, но ничего не вижу.

1 Ответ

0 голосов
/ 27 января 2019

Я бы не строил это вокруг окраски на твоем месте.windscribe может быть исключением (это не редкость), но программы Cli обычно проверяют, является ли их вывод терминальным устройством, перед тем как выписать вывод терминала, чтобы изменить цвет. это сообщение в блоге написано с примерами Python записи цветных данных в терминал, но должно хорошо работать для знакомства с механизмом цветовых кодов и почему ваше слово не соответствует тому, чтоВы ожидаете это.Так что, вероятно, лучше игнорировать цвет.

Честно говоря, использование сообщения о состоянии также не идеально.Эти состояния, предназначенные для потребления человеком, обычно не обеспечивают достаточно согласованного поведения с течением времени для обеспечения очень надежного интерфейса.Многие программы отображают свой статус более удобным для программы способом - может быть, сокетом, из которого вы можете прочитать статус, или файлом, или другим вызовом программы cli.Но может и нет - зависит от программы.Как правило, программы с открытым исходным кодом включают такие функции, потому что их разработчики часто имеют опыт работы в среде программирования CLI - собственный код, а не так.Но ymmv.

В любом случае, несмотря на все это, ваша проблема заключается в следующем:

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!

Здесь порядок слов не имеет значения, равно как их число или регистр, и он работает с цветом или без него, чтоэто просто игнорирует.Порядок имеет значение;очевидно, что «подключен» будет совпадать с «отключенными» совпадениями.

...