从Java程序运行Python代码,我应该这样做吗?

时间:2012-09-28 09:36:24

标签: java python jython

我有一个场景,我绘制网络并在基于swing的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() ) }

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

我只是从GUI中获取信息并使用Java代码创建一个类似上面的新python文件,然后使用Java中的ProcessBuilder类在mininet中运行此文件,这在某种程度上可以正常工作。

我想知道,这是正确而强大的方式,我是如何做到这一点,或者我应该进一步研究java-python网桥,比如场景更有效,或者说更专业。

编辑:

我想知道的选项是:

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

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

  3. 还有其他想法吗?我应该怎么做,或者我擅长这里所做的一切。

2 个答案:

答案 0 :(得分:1)

我建议使用易读的跨语言数据格式,如JSON。 Python和Java对JSON有很好的支持。我使用这种技术完成了PHP,Java和Python之间的集成。你所做的就像code generation这样也是一种有效的方法,但却有其缺点。以下是两种方法的优点:

代码生成优点/缺点

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

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

  • 可以验证是否可以捕获生成中的任何数据损坏或错误
  • 更好的安全性解析python中的JSON不执行任何只加载数据结构的代码
  • 特别是pretty print json in python
  • ,可以更轻松地查看
  • 要求您决定将节点映射到JSON的某些数据结构
  • 你必须写一些东西来获取该数据结构并从中生成你的Topo和Node对象。

答案 1 :(得分:0)

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

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

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