Разбор сообщений Redis MONITOR - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь построить мост между сервером Redis и MQTT, чтобы при обновлении базы данных Redis эти обновления отправлялись клиентам через MQTT.

Для этого клиента (только один,мост) подключается к базе данных Redis и начинает отслеживать ее.

Моя проблема связана с анализом команд, а точнее с содержащимися в них аргументами, представляющими собой список строк, разделенных пробелами.

Например, когда я сохраняю следующий хеш в Redis

data = {
  "key-3-1-json": "value-1",
  "key-3-2-json": 'this "this is \'quoted\' text"',
}
print r18.hmset("test-hash", {
  "key-1": "value-1",
  "key-2": 'this "this is \'quoted\' text"',
  "key-3": json.dumps(data),
})

, клиент получает следующее

1549578825.1 0 HMSET test-hash "key-3" "{\"key-3-1-json\": \"value-1\", \"key-3-2-json\": \"this \\\"this is 'quoted' text\\\"\"}" "key-2" "this \"this is 'quoted' text\"" "key-1" "value-1"

Как видите, я ужепарсинг метки времени, идентификатора базы данных, команды и ключа, но в последней части я не знаю, как создать из него список строк.

Это сообщение затем будет отправлено через MQTT как

mqtt.publish("redis/mon/0/HMSET/test-hash", json.dumps(args))

, где args будет

[
  "key-3",
  "{\"key-3-1-json\": \"value-1\", \"key-3-2-json\": \"this \\\"this is 'quoted' text\\\"\"}",
  "key-2",
  "this \"this is 'quoted' text\"",
  "key-1",
  "value-1"
]

, что, вероятно, будет наиболее сложным случаем, поскольку обычно аргументы представляют собой одну единственную строку, в случае, когда r18.set был бы использован яВместо r18.hmset.


Я думаю, что в Python должен быть какой-то встроенный модуль, который мог бы сделать это, как если бы он разбирал строку командной строки.

1 Ответ

0 голосов
/ 08 февраля 2019

Документация модуля subprocess гласит, что subprocess.Popen() использует shlex.split() ( shlex: простой лексический анализ )

Вызов shlex.split(args_str) эффективно преобразует строку аргументов вжелаемый список подстрок.

...