OpenTCS拓展之Python语言交互与拓展

      最近有小伙伴给我留言,问OpenTCS除了使用内核的Extention功能进行静态拓展外,还有没有更灵活的方式进行拓展呢?我推荐他使用python进行拓展。

python是一门动态的语言,号称胶水语言,非常容易和宿主语言进行结合,在JAVA中可以使用Jython进行集成,非常方便。

jython是python语言的JAVA实现版(以下统称Python),官网:

https://www.jython.org/

使用Python对OpenTCS进行拓展是不是很酷?这里来讲一下主要流程。

第一步:首先是添加gradle依赖。

dependencies {
  compile group: 'org.python', name: 'jython-standalone', version: '2.7.0'
}

这里注意,目前Jython只支持Python2,不支持Python3.

第二步:在你需要拓展的JAVA类构造函数中导入Python解释器。

新建一个test.py文件,如下所示:

print('hello python')
def func(vehicle):
	print(dir(vehicle))
	print(vehicle.getName())
	return True

导入Python解释器并执行上述文件:

//导入Jyhon相关包
import org.python.util.PythonInterpreter;
import org.python.core.PyObject;
import org.python.core.Py;
//
// .......无关代码省略
//

//生成一个Jython解释器
PythonInterpreter python = new PythonInterpreter();
//运行python文件
python.execfile('test.py');   

第三步:JAVA执行Python函数并得到返回值。

//得到python函数
PyObject action = python.get('func');
if(action!=null) {
     //传入一个参数,我这里的this代表一个CommunicationAdapter,待会再Python环境中可以直接使用此对象
     PyObject ret = action.__call__(Py.java2py(this));
     //这里将python的执行结果(返回值)转换为JAVA对象
     boolean retJava = (boolean)ret.__tojava__(boolean.class);
     //
     // .....做JAVA部分的逻辑
     //
}

以上几步完成后,运行上述test.py我们可以看到如下输出:

可以看出JAVA中集成Python非常非常简单。通过以上几步我们就成功的将python集成到了OpenTCS中了,并实现了数据的交互(JAVA调用Python函数并得到返回值,Python调用了JAVA对象的成员函数)

关于Jython的延伸:

Jython的底层是JAVA实现的,和JAVA可以进行完美的集合。这里再介绍下如何在Jython中加载JAR进行拓展。

首先是建立JAR包。建立一个MANIFEST.MF文件,如下:

Manifest-Version: 1.0
Created-By: loren(https://blog.csdn.net/xlh145)
Main-Class: Test

然后建立JAVA的源代码,实现一个Hello类,如下:

package com;
public class Hello{
     public static void speak(){
         System.out.println("hello");
     }
}

实现一个Test主类,如下:

import com.Hello;
class Test{
    public static void main(String[] agrs){
         Hello.speak();
     }
}

最终的目录结构为:

然后使用命令行进行编译并打包成Jar文件:

(1):javac  Test.java

(2):jar -cvfm demo.jar META-INF\MANIFEST.MF Test.class com 

通过以上两条命令将得到一个demo.jar文件。

测试一下通过Python来加载此Jar文件:

首先启动Python,通过如下命令可以独立的启动Python解释器并测试刚才生成的Jar(命令:java -jar jython-standalone-2.7.0.jar):

import sys
#这里要告诉python我们的jar文件在哪里
sys.path+=["。/demo.jar"]
import com.Hello as H
H.speak()

将输出Hello。

后语:

    使用Python来拓展OpenTCS有比较多的好处,比如说我们希望能把一些算法策略提取出来方便用户来修改,或者方便自己任意定制,那么就可以通过上面的方式把算法的逻辑部分进行剥离,直接放在Python中去执行。这样的体验是非常Nice的。

 

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值