最近有小伙伴给我留言,问OpenTCS除了使用内核的Extention功能进行静态拓展外,还有没有更灵活的方式进行拓展呢?我推荐他使用python进行拓展。
python是一门动态的语言,号称胶水语言,非常容易和宿主语言进行结合,在JAVA中可以使用Jython进行集成,非常方便。
jython是python语言的JAVA实现版(以下统称Python),官网:
使用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的。