Как запустить программу, а также выполнить код при получении данных из сети?

Я написал небольшую программу на Python, которая в основном делает следующее:

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

Я хотел бы добавить возможность выполнять команды по сети следующим образом (и научиться использовать Twisted по пути):

Клиент № 1 вводит команду, ориентированную на клиента № 2.Команда отправляется на сервер, который направляет ее клиенту № 2.Клиент № 2 получает команду и выполняет ее, если она действительна.

Примечание: ввод команд локально (используя код ниже) и удаленно должен быть возможен.

Подумав, я не смог придумать другого способа реализовать это, кроме:

Пусть вышеупомянутая программа запускается как процесс # 1 (программа, которая запускается локально, как я написал в начале).Twisted клиент будет запущен как процесс № 2 и получит команды от удаленных клиентов. Всякий раз, когда команда получена, клиент Twisted инициализирует поток, который будет анализировать команду, проверять ее правильность и выполнять, если она действительна.

Поскольку у меня нет такого большого опыта работы с потоками и никакого опыта работы с сетевым программированием, я не мог придумать какую-либо другую схему, которая имеет для меня смысл.

Является ли приведенная выше схема слишком сложной? Я был бы признателен за понимание, прежде чем пытаться реализовать это таким образом.

Код для программы на Python (без клиента):

Основной (который является методом start ()):

class Controller:
    def __init__(self,listener, executor):
        self.listener = listener
        self.executor = executor


    def start(self):
        while True:
            text = self.listener.listen_for_hotword()

            if self.executor.is_hotword(text):
                text = self.listener.listen_for_command()
                if self.executor.has_matching_command(text):
                    self.executor.execute_command(text)
                else:
                    tts.say("No command found. Please try again")

Слушатель (получает ввод от пользователя):

class TextListener(Listener):
    def listen_for_hotword(self):
        text = raw_input("Hotword: ")
        text =' '.join(text.split()).lower()
        return text

    def listen_for_command(self):
        text = raw_input("What would you like me to do: ")
        text = ' '.join(text.split()).lower()
        return text

Исполнитель (класс, который выполняет данную команду):

class Executor:
    #TODO: Define default path
    def __init__(self,parser, audio_path='../Misc/audio.wav'):
        self.command_parser = parser
        self.audio_path = audio_path

    def is_hotword(self,hotword):
        return self.command_parser.is_hotword(hotword)

    def has_matching_command(self,command):
        return self.command_parser.has_matching_command(command)

    def execute_command(self,command):
        val = self.command_parser.getCommand(command)
        print val
        val = os.system(val) #So we don't see the return value of the command

Парсер командного файла:

class KeyNotFoundException(Exception):
    pass


class YAMLParser:
    THRESHOLD = 0.6

    def __init__(self,path='Configurations/commands.yaml'):
        with open(path,'r') as f:
            self.parsed_yaml = yaml.load(f)

    def getCommand(self,key):
        try:
            matching_command = self.find_matching_command(key)
            return self.parsed_yaml["Commands"][matching_command]
        except KeyError:
            raise KeyNotFoundException("No key matching {}".format(key))

    def has_matching_command(self,key):
        try:
            for command in self.parsed_yaml["Commands"]:
                if jellyfish.jaro_distance(command,key) >=self.THRESHOLD:
                    return True
        except KeyError:
            return False

    def find_matching_command(self,key):
        for command in self.parsed_yaml["Commands"]:
            if jellyfish.jaro_distance(command,key) >=0.5:
                return command

    def is_hotword(self,hotword):
        return jellyfish.jaro_distance(self.parsed_yaml["Hotword"],hotword)>=self.THRESHOLD

Пример файла конфигурации:

Commands:
  echo : echo hello


Hotword: start

Ответы на вопрос(1)

Ваш ответ на вопрос