0

我有一个场景,我绘制一个网络并在基于摆动的 GUI 上设置它的所有参数,之后我必须将此网络转换为基于 python 的脚本,另一个框架读取并以虚拟机的形式实现这个网络。

例如,请看这里:

from mininet.topo import Topo, Node
class MyTopo( Topo ):
    def *__init__*( self, enable_all = True ):
        super( MyTopo, self ).__init__()
        Host = 1
        Switch = 2
        self.add_node( Switch, Node( is_switch=True ) )
        self.add_node( Host, Node( is_switch=False ) )
        self.add_edge( Host, Switch )
        self.enable_all()
topos = { 'mytopo': ( lambda: MyTopo() ) }

它只是将 a 连接host到 aswitch并在 python 框架上实现此拓扑。
现在为了在 Java GUI 上实现绘制的网络,我正在做的是:

我只是从 GUI 中获取信息并使用 Java 代码创建一个新的 python 文件,如上面的那个,然后使用 Java 中的ProcessBuilderClass 在 mininet 中运行这个文件,它以某种方式工作得很好。

我想知道,这是我如何做到这一点的正确和稳健的方式,还是我应该进一步研究 java-python 桥之类的场景,以便更有效或更专业。

编辑:

我想知道的选项是:

  1. 以众所周知的格式(也许是 yaml?)序列化 GUI,可以由 python 反序列化,然后在 python 中添加其他功能以将该信息传递给该脚本。

  2. 添加一个 Java-Python 桥以直接从代码中执行此操作??

  3. 还有什么想法吗?我应该做什么,或者我擅长这里正在做的任何事情。

4

2 回答 2

1

我建议使用易于阅读的跨语言数据格式,例如 JSON。Python 和 Java 对 JSON 有很好的支持。我已经使用这种技术完成了 PHP、Java 和 Python 之间的集成。您所做的类似于代码生成,这也是一种有效的方法,但也有其缺点。以下是两种方法的一些优点/缺点:

代码生成的优点/缺点

  • 有时可以很容易实施
  • 安全问题,一个程序正在生成代码以在另一个环境中执行,python 代码可以运行任何命令
  • 没有验证,如果您的代码生成库有错误,则无法验证它的输出,因为它不是数据结构。再次出现潜在的安全问题。
  • 非常强大,您基本上可以从您的 java 库中运行任何 python 代码

数据交换(JSON)的优点/缺点

  • 可以进行验证以捕获生成中的任何数据损坏或错误
  • 在 python 中更好的安全性解析 JSON 不执行任何代码,它只是加载数据结构
  • 可以更容易查看,尤其是如果您在 python 中漂亮地打印 json
  • 需要你决定一些数据结构来将你的节点映射到 JSON
  • 您将不得不编写一些东西来获取该数据结构并从中生成您的 Topo 和 Node 对象。
于 2012-09-28T10:13:38.813 回答
0

如果您的 Python 代码依赖于纯 Python 库,那么您可以使用嵌入式 Jython

我的首选是将配置序列化为不可知格式的第一个选项。从 Java 编写 Python 源代码将很难维护。

如果您决定进行序列化,请考虑在 Java 端使用 JAXB 或类似的 XML 模式来构建严格的 XML 数据交换格式。然后,您可以使用 PyXB 将 XML 转换回 Python 对象。

于 2012-09-28T10:17:40.127 回答