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. windows安装redis, php5.5

    全套安装包地址 http://download.csdn.net/detail/whellote/9572797   解压 redis-2.2.5-win32-win64, 将里面的内容拷贝到j:/r ...

  2. .net操作xml文件(新增.修改,删除,读取) 转

    今天有个需求需要操作xml节点.突然见遗忘了许多.上网看了些资料.才整出来.脑袋真不够用.在这里把我找到的资料共享一下.方便以后使用.本文属于网摘/ 1 一.简单介绍2 using System.Xm ...

  3. CGlib和JDK动态代理

    一.CGlib动态代理     JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了.CGLib采用了非常底层的1:字节码技术,其原理是通过字节 ...

  4. Python+Appium API

    1.contextscontexts(self): Returns the contexts within the current session. 返回当前会话中的上下文,使用后可以识别H5页面的控 ...

  5. Winter-2-STL-G Team Queue 解题报告及测试数据

    Time Limit:3000MS     Memory Limit:0KB Description Queues and Priority Queues are data structures wh ...

  6. linux下 安装php的gettext模块

    安装php的模块有两种方式: 一.重新编译php,加上--with-gettext 二.动态安装 现在说下第二个动态安装 1.下载同版本的php原包,解压后进入ext目录,目录下便是模块 2.进入ge ...

  7. C++中string的成员函数

    string类的构造函数: string(const char *s); //用c字符串s初始化 string(int n,char c); //用n个字符c初始化 此外,string类还支持默认构造 ...

  8. Spring提前加载与懒加载

    首先,Spring默认是提前加载,这意味着当项目启动,spring初始化,spring会把所有的扫描包下的 ,所有带spring 注解(@Component.@Repository.@Service. ...

  9. 20145302张薇《Java程序设计》实验五报告

    20145302张薇 实验五:Java网络编程及安全 实验内容 掌握Socket程序的编写: 掌握密码技术的使用: 设计安全传输系统. 实验要求 基于Java Socket实现安全传输 基于TCP实现 ...

  10. nuget sources

    https://docs.microsoft.com/en-us/nuget/tools/cli-ref-sources https://gemfury.com/help/nuget-server/ ...