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. android 带RadioButton的Dialog

    package com.example.dialog3; import android.os.Bundle;import android.app.Activity;import android.app ...

  2. phpMyAdmin的安装配置

    找到$cfg['blowfish_secret'] = '',将其值改为你自己想要的任意字符,如$cfg['blowfish_secret'] = 'owndownd': 找到$cfg['Server ...

  3. pycharm激活(转)

    1.注册码激活Activation code http://idea.lanyus.com/ 2.服务器激活License server(推荐) 或者http://182.254.242.193:10 ...

  4. php处理restful请求的路由(转载 http://www.jb51.net/article/47333.htm)

    <?php    class Router {        // 路由表        private $routers = array(            array("nam ...

  5. Word 中将正文中的参考文件标号链接到参考文献具体条目

    一.概论 在论文撰写过程中,不可避免地引用到参考文献.通常,论文格式要求我们在引用的正文后,使用中括号将参考文献章节中对应的出处条目序号引起来,例如: 有时,我们要建立起这两者之间的链接关系. 二.设 ...

  6. 论文笔记:空间变换网络(Spatial Transformer Networks)

    2015, NIPS Max Jaderberg, Karen Simonyan, Andrew Zisserman, Koray Kavukcuoglu Google DeepMind 为什么提出( ...

  7. 什么是Socket?简单点,通俗易懂的?

    网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API),对TCP/IP的封装 ...

  8. c++之旅:函数模板

    函数模板 函数模板主要是泛型在函数的中的应用,通过泛型可以让函数处理各种各样的数据类型 简单的列子 #include <iostream> using namespace std; tem ...

  9. ServletConfig获取Servlet的公共参数方法

    web.xml配置: <servlet> <servlet-name>AServlet</servlet-name> <servlet-class>AS ...

  10. 使用selenium前学习HTML(3)— 属性

    <!-- HTML标签可以拥有属性,属性提供元素的更多的信息: 属性总是以名称/值对的形式出现,比如:name="value". 属性总是在 HTML 元素的开始标签中规定. ...