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,在代码编译运行上存在着极大的问题,尤其是开始编 ...
随机推荐
- k8s-安装coreos+kubernetes
开始 软件 版本 分支 简称 Container Linux 1465.7.0 stable coreos kubernetes 1.7.3 stable k8s 本文主要内容来自coreos.com ...
- Winter-1-D Max Sum 解题报告及测试数据
Time Limit:1000MS Memory Limit:32768KB Description Given a sequence a[1],a[2],a[3]......a[n], your j ...
- Ubuntu16.04系统中Nmon的安装
Nmon的安装,亲民的安装方法: apt install nmon 不再需要源码编译安装和下载文件到指定目录,解压再运行了.
- 某Facebook工程师写的攻略。
Chapter 1 Interesting read, but you can skip it. Chapter 2 2.1 Insertion Sort - To be honest you sho ...
- CSS Display(显示)和Visibility(可见性)
CSS Display(显示)和Visibility(可见性) 一.简介 display属性设置一个元素应如何显示(隐藏不占用空间),visibility属性指定一个元素应可见还是隐藏(隐藏占用空间) ...
- Docker---大型项目容器化改造
虚拟化和容器化是项目云化不可避免的两个问题.虚拟化由于是纯平台操作,一个运行于linux操作系统的项目几乎不需要做任何改造就可以支持虚拟化.而项目如果要支持容器化则需要做许多细致的改造工 ...
- 解读:MR多路径输入
对于在一个MR-Job中使用多路径作为输入文件,一般有三种方法: 1).多次调用,加载不同路径: import org.apache.hadoop.mapreduce.lib.input.FileIn ...
- chrome中,BackstopJS 使用cookie文件后依旧提示需要登录
1. 本地环境: apache-tomcat:7.05,jdk8, backstopJS:latest-version 配置tomcat管理用户成功:手工访问tomcat应用内部服务正常: 2. 问 ...
- Android Studio开发学习 - 1. 添加Activity
1. 项目上点右键,New -> Activity -> Blank Activity 这将生成Activity的 Layout.Class .和相关的配置信息(在AndroidManif ...
- Oracle SQL Developer 编辑区不能删除,后退,空格,复制粘贴等功能都失效的解决办法
Oracle SQL Developer 编辑区不能删除,后退,空格,复制粘贴等功能都失效的解决办法 解决: 打开菜单并选择Tools-prefrence-Accelerators-Load Pres ...