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

我有一个场景,我画了一个网络并在基于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桥之类的场景,使其更加有效,或者说更加专业。

编辑:

我想知道的选项是:

以众所周知的格式(可能是Yaml?)对GUI进行序列化,可以通过python将其反序列化,然后在python中添加其他功能以将该信息传递给此脚本。
添加Java-Python桥以直接从代码内完成此操作?
还有其他想法吗?我该怎么办,或者我擅长在这里做什么。

参考方案

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

代码生成的利弊

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

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

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

Java:找到特定字符并获取子字符串 - java

我有一个字符串4.9.14_05_29_16_21,我只需要获取4.9。数字各不相同,所以我不能简单地获得此char数组的前三个元素。我必须找到最正确的.并将其子字符串化直到那里。我来自Python,因此我将展示Python的实现方法。def foobar(some_string): location = some_string.rfind('.&…

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…

Java-如何将此字符串转换为日期? - java

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…