繁体   English   中英

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

[英]Running Python code from Java program, should i be doing this?

我有一个场景,我画了一个网络并在基于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 Class在mininet中运行此文件,该方法工作正常。

我想知道,这是我执行此操作的正确且可靠的方法,还是我应该进一步研究java-python桥之类的场景,使其更加有效,或者说更加专业。

编辑:

我想知道的选项是:

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

  2. 添加Java-Python桥以直接从代码内完成此操作?

  3. 还有其他想法吗? 我该怎么办,或者我擅长在这里做什么。

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

代码生成的利弊

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

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

  • 可验证以捕获任何数据损坏或生成中的错误
  • 更好的安全性在python中解析JSON不会执行任何代码,它只会加载数据结构
  • 可以更轻松地查看,特别是如果您在python中打印json时
  • 要求您决定某种数据结构以将节点映射到JSON
  • 您将必须编写一些内容以采用该数据结构并从中生成Topo和Node对象。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM