java和python互相调用
来源:互联网 发布:汽车修理学习软件 编辑:程序博客网 时间:2024/05/19 13:17
python作为一种脚本语言,大量用于测试用例和测试代码的编写,尤其适用于交互式业务场景。实际应用中,很多网管系统做的如交换机、防火墙等设备升级,往往和设备交互的命令以及设备回显的信息都是在python脚本中写好,java工程直接调用相应的python脚本,执行升级的具体步骤。但是具体的命令一般通过和设备建立的ssh连接交互,最后python又重新调回java实现的ssh功能。
Jython是一种完整的语言,而不是一个Java翻译器或仅仅是一个Python编译器,它是一个Python语言在Java中的完全实现。Jython也有很多从CPython中继承的模块库。最有趣的事情是Jython不像CPython或其他任何高级语言,它提供了对其实现语言的一切存取。所以Jython不仅给你提供了Python的库,同时也提供了所有的Java类。
java和python的互相调用,就需要用到Jython,可在该连接下载Jython相关jar包:https://repo1.maven.org/maven2/org/python/jython。
废话少说,直接上个最简单的例子,简单明了。
Jython环境类
package com.webim.test.jython;import org.python.core.PySystemState;import org.python.util.PythonInterpreter;/** * Jython环境,生存python解释器 * @author webim * */public final class JythonEnvironment{private static JythonEnvironment INSTANCE = new JythonEnvironment();/** * 私有构造方法 */private JythonEnvironment(){}/** * 获取单例 * @return JythonEnvironment */public static JythonEnvironment getInstance(){return INSTANCE;}/** * 获取python系统状态,可根据需要指定classloader/sys.stdin/sys.stdout等 * @return PySystemState */private PySystemState getPySystemState(){PySystemState.initialize();final PySystemState py = new PySystemState();py.setClassLoader(getClass().getClassLoader());return py;}/** * 获取python解释器 * @return PythonInterpreter */public PythonInterpreter getPythonInterpreter(){PythonInterpreter inter = new PythonInterpreter(null, getPySystemState());return inter;}}
java调用python
package com.webim.test.jython;import java.util.Map;import java.util.Map.Entry;import org.python.util.PythonInterpreter;/*enum的这个用法,可以作为变种的安全单例,值得借鉴哦 ^_^ */public enum ExecPython{INSTANCE;public void execute(String scriptFile, Map<String,String> properties){//获取python解释器final PythonInterpreter inter = JythonEnvironment.getInstance().getPythonInterpreter();//设置python属性,python脚本中可以使用for (Entry<String,String> entry : properties.entrySet()){inter.set(entry.getKey(), entry.getValue());}try{//通过python解释器调用python脚本inter.execfile(scriptFile);}catch (Exception e){System.out.println("ExecPython encounter exception:" + e);}}}
供python调用的java类
package com.webim.test.jython;/** * 供python脚本调用的java类 * @author webim * */public class SayHello{private String userName;public String getUserName(){return userName;}public void setUserName(String userName){this.userName = userName;}public void say(int i){System.out.println(i + ":Hello " + userName);}}
测试代码
package com.webim.test.jython;import java.util.HashMap;import java.util.Map;/** * 测试java和python的调用流程 * @author webim * */public enum TestExecPython{INSTANCE;public void test(){String scriptFile = "test.py";Map<String,String> properties = new HashMap<String,String>();properties.put("userName", "Demo");ExecPython.INSTANCE.execute(scriptFile, properties);}}
main方法类
package com.webim.test.main;import com.webim.test.jython.TestExecPython;public class Main {public static void main(String[] args) {TestExecPython.INSTANCE.test();}}python脚本
#unicode=UTF-8##################################################通过java package导入java类from com.webim.test.jython import SayHelloexecpy = SayHello()##################################################将python属性传入后续调用的java实例execpy.setUserName(userName)def say(): execpy.say(5) returnsay()
执行结果
1 0
- java和python互相调用
- java和python互相调用
- java和python互相调用
- VC和Python的互相调用
- VC和Python的互相调用
- python和C的互相调用
- java和.net互相调用webservice注意事项
- java和.net互相调用webservice注意事项
- javascript和java applet互相调用
- JniHelper java和c++互相调用
- Android WebView java和js互相调用
- android js 和java互相调用
- JNI--java和C++互相调用
- JavaScript 和 java 的互相调用
- Android C++和JAVA互相调用
- python和C/C++的互相调用 VC
- python和C/C++的互相调用 VC
- python c/c++ 互相调用
- Codeforces Round #356 (Div. 1)D. Bear and Tower of Cubes【pair使用】
- Hive 没有 not in 解决方案
- POJ 2524 Ubiquitous Religions (并查集)
- BZOJ1711 [Usaco2007 Open]Dining吃饭 题解&代码
- 关于TCS230颜色传感器的使用
- java和python互相调用
- Java用数组实现顺序队列
- redis系列 ---简单介绍
- 第15周程序阅读6
- HDU 3465 线段树
- Android NumberPicker探析
- hdu 5444 继续二叉查找树
- mysql删除数据
- ANR in an IntentService with its own process