python和Java程序跨语言协作

最近有一个需求,就是需要拿Java程序运算更新的结果到python中调库训练图网络,所以需要两边的一些数据进行交互,经过调查选择了如下方法,记录如下:

1. Jython在Java中运行python程序

优点是简单,而且更像是一个完整的程序,python的库可以在Java的虚拟机中被重新编译运行;缺点是有的库不太支持,可能是没人更新这些库或者工作量太大没人整完,这次我需要用到的DGL库就没有支持Jython的平替方案。

总体方法如下:

首先是添加jar包,如果项目是用maven或者gradle可以直接添加依赖,但是我的项目不是用这些工具构建的,所以我需要手动添加到Java库中:jython-standalone

image-20240211215335326

然后是测试是不是正确添加以及流程是否正确,这里略过结果。

问题出在了python程序如果较大的话,要注意,需要把整个流程封装到一个函数里,也就是我这样:

image-20240211215618405

然后需要传入的参数写到这个函数的参数列表中,因为Java中给python程序传参,不是直接给到python的文件中,而是给到python文件中的某一个指定的函数中。

最后如果没有库缺失,应该就可以成功,我在这里失败了,因为我的DGL库缺失,没有被成功重新编译成Java支持的语言,所以失败了。放弃了这个方法。

2. 通过本地文件实现数据在python程序和Java程序之间来回流动

逻辑是Java进行计算,python进行预测。工作是用一个json文件监测程序流动。

这里我用一个status实现两边状态的来回切换,status作为一个布尔值,控制着两边的程序接力运行,用轮询来实现这一过程。

image-20240214222538490

在上图这里给出网络的txt源数据(后续再给到config.properties)

image-20240214222900723

seriously主函数中还有三处data.json,大家随便在计算机的任何可访问位置添加一个空白json文件,把绝对路径替换seriously中三处data.json即可

在python文件中,大家修改Link.py中两处data.json路径即可,方法同上:

image-20240214223232320

参考资料:

Google Code Archive - Long-term storage for Google Code Project Hosting.

Downloads | Jython

Java调用Python程序方法、Jpython使用-CSDN博客