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,在代码编译运行上存在着极大的问题,尤其是开始编 ...
随机推荐
- PKU 1521 Entropy(简单哈弗曼树_水过)
题目大意:原题链接 给你一个字符串,首先是计算出一个按正常编码的编码长度,其次是计算出一个用霍夫曼编码的编码长度,最后求正常编码的长度除以霍夫曼编码长度的比值,保留一位小数. 解题思路:需要知道 1. ...
- iOS 学习 RESTful 中 Http 的幂等性
一. RESTful RESTful (Representational State Transfer) 是一种常用流行的软件架构,设计风格或协议标准.提供了一组设计风格和约束条件.主要用于客户端和 ...
- design thinking
- Redis 数据结构-字符串源码分析
相关文章 Redis 初探-安装与使用 Redis常用指令 本文将从以下几个部分进行介绍 1.前言 2.常用命令 3.字符串结构 4.字符串实现 5.命令是如果操作字符串的 前言 平时在使用 Redi ...
- hadoop hdfs设置quota
quota分为两种: 1. 目录下的文件数限制 2. 目录下的空间大小 //设置文件数 hdfs dfsadmin -setQuota 1000000 /user/jenkin //设置空间大小 hd ...
- 自我管理--拖延 vs 心理
案例1:你在销售公司产品,需要更多客户,这时你收到一条短信,说对你们产品感兴趣,让你马上发送详细资料看看,语气颇为傲慢.你有点恼火,这个人一点都不客气,于是两小时后你才发送过去. 案例2:这个月的 ...
- 20145322何志威 《Java程序设计》第8周学习总结
教材学习内容总结 第十四章 NIO使用频道(channel)来衔接数据节点,对数据区的标记提供了clear(),rewind(),flip(),compact()等高级操作. 想要取得channel的 ...
- 20145201李子璇《网络对抗》逆向及Bof基础实践
20145201李子璇<网络对抗>逆向及Bof基础实践 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回 ...
- 关于js中对事件绑定与普通事件的理解
普通事件指的是可以用来注册的事件: 事件绑定是指把事件注册到具体的元素之上. 通俗点说: 普通事件:给html元素添加一个特定的属性(如:onclick): 事件绑定:js代码中通过标记(id ta ...
- bzoj 3450: Tyvj1952 Easy
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 411 Solved: 309[Submit][Status][Discuss] Descriptio ...