如何从python模块内部运行Mininet CLI命令

如何从python模块内部运行Mininet CLI命令,python,command-line-interface,background-process,mininet,Python,Command Line Interface,Background Process,Mininet,我编写了一个python模块,使用Mininet和连接的OpenDayLight作为远程控制器生成一个随机拓扑 我想向mininetcli传递一个命令,但是要从python模块内部传递。生成主机和交换机并将其连接到远程控制器后,模块随机选择2台主机作为服务器和客户端。 我在做类似的事情时遇到了问题,但在python模块内部的内联操作中: mininet> h<random_number> sudo python HTTPTraffic.py <SrcIP> <

我编写了一个python模块,使用Mininet和连接的OpenDayLight作为远程控制器生成一个随机拓扑

我想向mininetcli传递一个命令,但是要从python模块内部传递。生成主机和交换机并将其连接到远程控制器后,模块随机选择2台主机作为服务器和客户端。 我在做类似的事情时遇到了问题,但在python模块内部的内联操作中:

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

从(请参阅“定制网络”一节),类似的事情是可能的,但我在做这件事时遇到了很多麻烦。另外,我希望这个命令在主程序运行时在后台运行。非常感谢您的反馈。

我建议您查看Python模块的文档,该模块充当从您的程序运行其他程序的平台无关API

例如,您可以通过在代码中添加以下行来调用
ls

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

run
的第一个参数接受一个字符串数组,其中每个字符串都是正在执行的命令的一部分

在我再次阅读你的问题后,我才意识到这一点,看起来我的建议实际上并没有回答你的问题。它看起来像是在做你想做的事情,你会想要使用mininet API,因为mininet CLI是一个交互终端。实际上这不是我想要的。我的主要问题是如何将命令从python传递到Mininet CLI。你的建议可能回答了我的第二个问题,那就是在后台运行。不过,我还是想在找到第一个问题的解决方案后尽快尝试一下。看看问答,并阅读一些评论。有一种方法可以使用
subprocess.Popen
在python中包装交互式CLI。基本上,您将使用
Popen
调用
sudo mn
,并使用
proc.stdin.write(“命令字符串”)
传递命令,使用
line=proc.stdout.readline()
读取mininet的输出。我按照您的建议尝试了使用
子流程
,但是它将命令传递给Linux CLI而不是mininet CLI。您提到了使用Popen调用sudo mn,您能提供一个例子吗?此外,代码似乎在传递包含1个以上单词的命令时存在问题<很遗憾,code>shlex.split没有起作用。好吧,它看起来有点像:
proc=subprocess.Popen(['sudo',mn'],stdout=subprocess.PIPE,stdin=subprocess.PIPE)
然后使用
proc.stdin.write
方法将命令传递给mininet。然后可以使用
proc.stdout.readline()
读取结果。
subprocess.run(["ls", "-l"])