java和python互相调用
java和python互相调用
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 SayHello
- execpy = SayHello()
- #################################################
- #将python属性传入后续调用的java实例
- execpy.setUserName(userName)
- def say():
- execpy.say(5)
- return
- say()
java和python互相调用的更多相关文章
- 在python里调用java的py4j的使用方法
py4j可以使python和java互调 py4j并不会开启jvm,需要先启动jvm server,然后再使用python的client去连接jvm GatewayServer实例:允许python程 ...
- Sublime Text 3 调用cmd运行c、java、python、batch file
一.调用cmd运行c(首先复制MinGW到C盘根目录,并添加环境变量) Tools --> Build System --> New Build System 删除所有内容 复制如下代码进 ...
- 利用thrift在c++、java和python之间相互调用
转自:http://blog.csdn.net/andy_yf/article/details/7487384 thrift做为跨语言调用的方案有高效,支持语言较多,成熟等优点:代码侵入较强是其弱点. ...
- PySpark 的背后原理--在Driver端,通过Py4j实现在Python中调用Java的方法.pyspark.executor 端一个Executor上同时运行多少个Task,就会有多少个对应的pyspark.worker进程。
PySpark 的背后原理 Spark主要是由Scala语言开发,为了方便和其他系统集成而不引入scala相关依赖,部分实现使用Java语言开发,例如External Shuffle Service等 ...
- 《精通并发与Netty》学习笔记(07 - 基于Thrift实现Java与Python的RPC调用)
上节我们介绍了基于Thrift实现java与java的RPC调用,本节我们基于Thrift实现Java与Python的RPC调用 首先,修改data.thirft文件,将命名空间由java改为py n ...
- windows、ubuntu下eclipse搭建java、Python环境问题总结
前两篇博文分别讲述了如何在windows.ubuntu下用eclipse搭建java.python环境,下面就针对本人遇到的问题做一个总结. 一.windows下关于java环境变量JAVA_HOME ...
- paip.函数方法回调机制跟java php python c++的实现
paip.函数方法回调机制跟java php python c++的实现 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http:// ...
- paip.执行shell cmd 命令uapi java php python总结
paip.执行shell cmd 命令uapi java php python总结 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:h ...
- 关于Visual Studio调试C/C++,JS,PHP,JAVA,Python等语言的方法
我在开始接触vs code后,确实对它的高颜值和小巧灵活而着迷,但是有一个非常现实的问题,相对于vs来说,vscode是一个代码编辑器,而不是一个IDE,在代码编译运行上存在着极大的问题,尤其是开始编 ...
随机推荐
- sql server 复制表从一个数据库到另一个数据库
sql server 复制表从一个数据库到另一个数据库 /*不同服务器数据库之间的数据操作*/ --创建链接服务器 exec sp_addlinkedserver 'ITSV ', ' ', 'SQL ...
- PKU 2823 Sliding Window(线段树||RMQ||单调队列)
题目大意:原题链接(定长区间求最值) 给定长为n的数组,求出每k个数之间的最小/大值. 解法一:线段树 segtree节点存储区间的最小/大值 Query_min(int p,int l,int r, ...
- Problem A. Array Factory XVII Open Cup named after E.V. Pankratiev Stage 4: Grand Prix of SPb, Sunday, Octorber 9, 2016
思路: 直接二分长度不可行,因为有负数. 考虑枚举坐便删l个数,那如果可以在短时间内求出符合条件的右边最小删的数的个数,这题便可做了. 即:当左边删l个数时,要使sum[n]-sum[l]-fsum[ ...
- cdoj1587 失恋772002天
地址:http://acm.uestc.edu.cn/#/problem/show/1587 题目: 失恋772002天 Time Limit: 3000/1000MS (Java/Others) ...
- DOM—节点
节点的相关属性 1.nodeType:节点类型.返回的是一个数字,这个数字代表节点类型,只读. 节点类型: 1 — 元素类型:元素节点(标签) 节点类型: 2 — 元素类型:属性节点 节点类型: 3 ...
- 记一次ZOOKEEPER集群超时问题分析
CDH安装的ZK,三个节点,基本都是默认配置,一直用得正常,今天出现问题,客户端连接超时6倍时长,默认最大会话超时时间是一分钟.原因分析:1.首先要确认网络正确.确认时钟同步.2.查看现有的配置,基本 ...
- 理解js的DOM操作
1.DOM结构——两个节点之间可能存在哪些关系以及如何在节点之间任意移动.document.documentElement 返回文档的根节点<html> document.body ...
- oracle lpad 函数使用介绍
函数介绍 lpad函数从左边对字符串使用指定的字符进行填充.从其字面意思也可以理解,l是left的简写,pad是填充的意思,所以lpad就是从左边填充的意思. 语法格式如下: lpad( string ...
- path.resolve()和path.join()
resolve 作用:path.resolve() 该方法将一些的 路径/路径段 解析为绝对路径. 语法:path.resolve([...paths]) 说明: ...paths <strin ...
- qq第三方登录网站接口
网站如何实现QQ登录功能 | 浏览:11029 | 更新:2013-12-05 10:09 1 2 3 4 5 6 7 分步阅读 一键约师傅 百度师傅为你的电脑系统,选一个靠谱师傅! 如果想让网站实现 ...