Как запустить команду Mininet CLI из модуля Python

Я написал модуль Python для генерации случайной топологии с помощью Mininet и подключил OpenDayLight в качестве удаленного контроллера.

Я хотел бы передать команду в интерфейс командной строки mininet, но изнутри модуля python. После создания хостов и коммутаторов, а также их подключения к удаленному контроллеру модуль случайным образом выбирает 2 хоста, которые будут действовать как сервер и клиент. У меня возникли проблемы с выполнением чего-то подобного, но из встроенного модуля python:

mininet> h<random_number> sudo python HTTPTraffic.py <SrcIP> <DstIP>

HTTPTraffic.py — это еще один модуль, который принимает аргументы SrcIP и DstIP.

Это часть основного модуля, которая выбирает 2 случайных хоста и получает их IP-адреса. Я хотел бы, чтобы HTTPTraffic.py работал на хосте, соответствующем SrcIP

Nodes = list(range(1,h))
Src = random.choice(Nodes)         # randomly chooses 1 host
Nodes.remove(Src)
Dst = random.choice(Nodes)         # randomly chooses another host

SrcName = 'h%s' %(Src)
DstName = 'h%s' %(Dst)
SrcNode=net.get(SrcName)
DstNode=net.get(DstName)

SrcIP = SrcNode.IP()               # IP retrieval of chosen hosts
DstIP = DstNode.IP()
print ('The Souce/Client is: '+ SrcName)
print (SrcIP)
print ('The Destination/Server is: '+ DstName)
print (DstIP) 

SrcName +".cmd('sudo python HTTPTraffic.py "+SrcIP+" " +DstIP+"')"    # this is where I am having trouble

Из документации API mininet (см. раздел "Настройка сети") нечто подобное возможно, но У меня так много проблем с этим. Кроме того, я хотел бы, чтобы эта команда работала в фоновом режиме, пока работает основная программа. Любая обратная связь приветствуется.


person Ahmed Ayman Ibrahim    schedule 30.03.2017    source источник
comment
Я понял это только после того, как снова прочитал ваш вопрос, похоже, мое предложение на самом деле не отвечает на ваш вопрос. Похоже, что для того, чтобы делать то, что вы пытаетесь сделать, вы захотите вместо этого использовать API-интерфейс mininet, поскольку интерфейс командной строки mininet действует как интерактивный терминал.   -  person wheeler    schedule 30.03.2017


Ответы (1)


Я рекомендую вам ознакомиться с документацией для модуля Python subprocess, который действует как независимый от платформы API для запуска других программ из вашей программы.

Например, вы можете вызвать ls, добавив в свой код следующую строку:

subprocess.run(["ls", "-l"])

Первый аргумент run принимает массив строк, где каждая строка является частью выполняемой вами команды.

person wheeler    schedule 30.03.2017
comment
на самом деле это не то, что я ищу. Моя основная проблема заключается в том, как передать команду из python в интерфейс командной строки Mininet. Ваше предложение может быть ответом на мою вторую проблему, которая заключается в том, чтобы запустить это в фоновом режиме. Тем не менее, я хочу попробовать, как только найду решение своей первой проблемы. - person Ahmed Ayman Ibrahim; 31.03.2017
comment
Взгляните на это SO-вопрос и ответ и прочитайте некоторые комментарии. . Есть способ обернуть интерактивный интерфейс командной строки в python, используя subprocess.Popen. По сути, вы будете вызывать sudo mn с помощью Popen, передавать ему команды с помощью proc.stdin.write("command string") и читать вывод mininet с помощью line = proc.stdout.readline(). - person wheeler; 31.03.2017
comment
Я попытался использовать subprocess, как вы предложили, но он передает команду в CLI Linux вместо CLI mininet. Вы упомянули вызов sudo mn с помощью Popen, как это делается, можете привести пример? Кроме того, код, похоже, имеет проблемы с передачей команд, состоящих более чем из 1 слова. shlex.split к сожалению не справился. - person Ahmed Ayman Ibrahim; 06.04.2017
comment
Итак, это будет выглядеть примерно так: proc = subprocess.Popen(['sudo', 'mn'], stdout=subprocess.PIPE, stdin=subprocess.PIPE) Затем вы будете передавать команды в мининет, используя метод proc.stdin.write. Затем вы можете прочитать результаты, используя proc.stdout.readline(). - person wheeler; 12.04.2017