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

从Java程序运行Python代码,我应该这样做吗?,java,python,jython,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__()

我有一个场景,在这个场景中,我绘制了一个网络,并在基于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() ) }
它只需将
主机
连接到
交换机
,并在python框架上实现此拓扑结构。
现在,为了在Java GUI上实现绘制的网络,我正在做以下工作:

我只需从GUI中获取信息,并使用Java代码创建一个新的python文件,如上面所述,然后使用Java中的
ProcessBuilder
类在mininet中运行该文件,该类工作正常

我想知道,这是我做这件事的正确和稳健的方式,还是我应该更深入地研究java python桥式场景,以便更有效,或者说更专业

编辑:

我想知道的选项是:

  • 以python可以反序列化的已知格式(yaml maybe?)序列化GUI,然后在python中添加附加功能以将该信息传递给此脚本

  • 添加一个Java Python桥来直接从代码中执行此操作

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


  • 我建议使用易于阅读的跨语言数据格式,如JSON。Python和Java非常支持JSON。我已经使用这种技术完成了PHP、Java和Python之间的集成。你所做的是这样的,这也是一个有效的方法,但也有它的缺点。以下是两种方法的一些优点/缺点:

    代码生成的优点/缺点

    • 有时可能很容易实现
    • 安全问题,一个程序正在生成代码以在另一个环境中执行,python代码可以运行任何命令
    • 无验证,如果您的代码生成库有bug,则无法验证其输出,因为它不是数据结构。这里再次出现了潜在的安全问题
    • 非常强大,您可以从java库中运行任何python代码
    数据交换(JSON)的优点/缺点

    • 可以验证以捕获生成过程中的任何数据损坏或错误
    • 更好的安全性在python中解析JSON不会执行任何代码,它只是加载一个数据结构
    • 可以更容易查看,尤其是如果您
    • 需要决定将节点映射到JSON的数据结构
    • 您必须编写一些东西来获取该数据结构并从中生成拓扑和节点对象

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

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


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

    数据交换还允许两个程序的实现独立发展:人们甚至可以决定用另一种语言重写其中一个!