java和python互相调用

 作者:xuaijun
 日期:2017.1.1

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环境类

  1. package com.webim.test.jython;
  2. import org.python.core.PySystemState;
  3. import org.python.util.PythonInterpreter;
  4. /**
  5. * Jython环境,生存python解释器
  6. * @author webim
  7. *
  8. */
  9. public final class JythonEnvironment
  10. {
  11. private static JythonEnvironment INSTANCE = new JythonEnvironment();
  12. /**
  13. * 私有构造方法
  14. */
  15. private JythonEnvironment()
  16. {
  17. }
  18. /**
  19. * 获取单例
  20. * @return JythonEnvironment
  21. */
  22. public static JythonEnvironment getInstance()
  23. {
  24. return INSTANCE;
  25. }
  26. /**
  27. * 获取python系统状态,可根据需要指定classloader/sys.stdin/sys.stdout等
  28. * @return PySystemState
  29. */
  30. private PySystemState getPySystemState()
  31. {
  32. PySystemState.initialize();
  33. final PySystemState py = new PySystemState();
  34. py.setClassLoader(getClass().getClassLoader());
  35. return py;
  36. }
  37. /**
  38. * 获取python解释器
  39. * @return PythonInterpreter
  40. */
  41. public PythonInterpreter getPythonInterpreter()
  42. {
  43. PythonInterpreter inter = new PythonInterpreter(null, getPySystemState());
  44. return inter;
  45. }
  46. }

java调用python

  1. package com.webim.test.jython;
  2. import java.util.Map;
  3. import java.util.Map.Entry;
  4. import org.python.util.PythonInterpreter;
  5. /*enum的这个用法,可以作为变种的安全单例,值得借鉴哦 ^_^ */
  6. public enum ExecPython
  7. {
  8. INSTANCE;
  9. public void execute(String scriptFile, Map<String,String> properties)
  10. {
  11. //获取python解释器
  12. final PythonInterpreter inter = JythonEnvironment.getInstance().getPythonInterpreter();
  13. //设置python属性,python脚本中可以使用
  14. for (Entry<String,String> entry : properties.entrySet())
  15. {
  16. inter.set(entry.getKey(), entry.getValue());
  17. }
  18. try
  19. {
  20. //通过python解释器调用python脚本
  21. inter.execfile(scriptFile);
  22. }
  23. catch (Exception e)
  24. {
  25. System.out.println("ExecPython encounter exception:" + e);
  26. }
  27. }
  28. }

供python调用的java类

  1. package com.webim.test.jython;
  2. /**
  3. * 供python脚本调用的java类
  4. * @author webim
  5. *
  6. */
  7. public class SayHello
  8. {
  9. private String userName;
  10. public String getUserName()
  11. {
  12. return userName;
  13. }
  14. public void setUserName(String userName)
  15. {
  16. this.userName = userName;
  17. }
  18. public void say(int i)
  19. {
  20. System.out.println(i + ":Hello " + userName);
  21. }
  22. }

测试代码

  1. package com.webim.test.jython;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. /**
  5. * 测试java和python的调用流程
  6. * @author webim
  7. *
  8. */
  9. public enum TestExecPython
  10. {
  11. INSTANCE;
  12. public void test()
  13. {
  14. String scriptFile = "test.py";
  15. Map<String,String> properties = new HashMap<String,String>();
  16. properties.put("userName", "Demo");
  17. ExecPython.INSTANCE.execute(scriptFile, properties);
  18. }
  19. }

main方法类

  1. package com.webim.test.main;
  2. import com.webim.test.jython.TestExecPython;
  3. public class Main
  4. {
  5. public static void main(String[] args)
  6. {
  7. TestExecPython.INSTANCE.test();
  8. }
  9. }

python脚本

  1. #unicode=UTF-8
  2. #################################################
  3. #通过java package导入java类
  4. from com.webim.test.jython import SayHello
  5. execpy = SayHello()
  6. #################################################
  7. #将python属性传入后续调用的java实例
  8. execpy.setUserName(userName)
  9. def say():
  10. execpy.say(5)
  11. return
  12. say()

java和python互相调用的更多相关文章

  1. 在python里调用java的py4j的使用方法

    py4j可以使python和java互调 py4j并不会开启jvm,需要先启动jvm server,然后再使用python的client去连接jvm GatewayServer实例:允许python程 ...

  2. Sublime Text 3 调用cmd运行c、java、python、batch file

    一.调用cmd运行c(首先复制MinGW到C盘根目录,并添加环境变量) Tools --> Build System --> New Build System 删除所有内容 复制如下代码进 ...

  3. 利用thrift在c++、java和python之间相互调用

    转自:http://blog.csdn.net/andy_yf/article/details/7487384 thrift做为跨语言调用的方案有高效,支持语言较多,成熟等优点:代码侵入较强是其弱点. ...

  4. PySpark 的背后原理--在Driver端,通过Py4j实现在Python中调用Java的方法.pyspark.executor 端一个Executor上同时运行多少个Task,就会有多少个对应的pyspark.worker进程。

    PySpark 的背后原理 Spark主要是由Scala语言开发,为了方便和其他系统集成而不引入scala相关依赖,部分实现使用Java语言开发,例如External Shuffle Service等 ...

  5. 《精通并发与Netty》学习笔记(07 - 基于Thrift实现Java与Python的RPC调用)

    上节我们介绍了基于Thrift实现java与java的RPC调用,本节我们基于Thrift实现Java与Python的RPC调用 首先,修改data.thirft文件,将命名空间由java改为py n ...

  6. windows、ubuntu下eclipse搭建java、Python环境问题总结

    前两篇博文分别讲述了如何在windows.ubuntu下用eclipse搭建java.python环境,下面就针对本人遇到的问题做一个总结. 一.windows下关于java环境变量JAVA_HOME ...

  7. paip.函数方法回调机制跟java php python c++的实现

    paip.函数方法回调机制跟java php python c++的实现 作者Attilax 艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http:// ...

  8. paip.执行shell cmd 命令uapi java php python总结

    paip.执行shell cmd 命令uapi java php python总结 作者Attilax  艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:h ...

  9. 关于Visual Studio调试C/C++,JS,PHP,JAVA,Python等语言的方法

    我在开始接触vs code后,确实对它的高颜值和小巧灵活而着迷,但是有一个非常现实的问题,相对于vs来说,vscode是一个代码编辑器,而不是一个IDE,在代码编译运行上存在着极大的问题,尤其是开始编 ...

随机推荐

  1. 微信小程序组件switch

    表单组件switch:官方文档 Demo Code: Page({ switch1Change: function (e){ console.log('switch1 发生 change 事件,携带值 ...

  2. 4. MySQL必知必会之排序检索数据-ORDER BY

    本章将讲授如何使用SELECT语句的ORDER BY子句,根据需要排序检 索出的数据. 1. 排序数据

  3. 001-netty的优势

    1.API简单. 2.性能高. 3.成熟稳定. 4.入门门槛低.

  4. PKU 1204 Word Puzzles(AC自动机)

    题目大意:原题链接 给定一个字符串矩阵和待查找的单词,可以朝8个不同的方向查找,输出待查找单词第一个字母在矩阵中出现的位置和该单词被查到的方向. A~H代表8个不同的方向,A代表正北方向,其他依次以4 ...

  5. ECMAScript与JavaScript

    ECMAScript发展史: 1997 1998.6 1999.12 2008.7 2009.12 2015.61996年11月 javaScript创造者Netscape公司将javaScript提 ...

  6. linux下创建用户,给用户设置密码,给用户授权

    1.linux下的用户是属于组的,所以需要创建一个组,划分给用户.创建命令: 在root下执行 groupadd  ver     创建一个组ver 2.创建用户            useradd ...

  7. nginx windows版本 1024限制

    Windows版本因为文件访问句柄数被限制为1024了,当访问量大时就会无法响应. 会有如下错误提示:maximum number of descriptors supported by select ...

  8. 关于Log4Net的使用和配置

    1. 添加log4net.dll引用 2.在添加引用的那层的 AssemblyInfo.cs         注册   : [assembly: log4net.Config.XmlConfigura ...

  9. elasticsearch 5.5.1 head插件安装

    5.5.1版本与之前版本有很大不同. 1. 下载插件 git clone git://github.com/mobz/elasticsearch-head.git 2. 编译 cd elasticse ...

  10. awk十三问-【AWK学习之旅】

    ---===AWK学习之旅===--- 十三个常用命令行处理   [root@monitor awkdir]# cat emp.txt Beth 4.00 0 Dan 3.75 0 Kathy 4.0 ...