转自http://blog.csdn.net/wxiaow9000/article/details/51660299

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

[java] view plaincopy
  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

[java] view plaincopy
  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类

[java] view plaincopy
  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. }

测试代码

[java] view plaincopy
  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方法类

[java] view plaincopy
  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脚本

[python] view plaincopy
  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. java和python可以在一个项目中同时使用么-java调用python的几种用法(看这篇就够了)...

    java调用python的几种用法如下: 在java类中直接执行python语句 在java类中直接调用本地python脚本 使用Runtime.getRuntime()执行python脚本文件(推荐 ...

  2. Java如何跨语言调用Python/R训练的模型

    在 如何使用sklearn进行在线实时预测(构建真实世界中可用的模型) 这篇文章中,我们使用 sklearn + flask 构建了一个实时预测的模型应用.无论是 sklearn 还是 flask,都 ...

  3. java执行python返回null_[转]java调用python脚本以及通过Process.waitFor()直接调用python模块返回错误代码1的一种解决办法...

    常见的java调用python脚本方式 通过jython提供的类库实现 通过Runtime.getRuntime()开启进程来执行脚本文件 通过jython提供的类库实现 通过jython实现的话,我 ...

  4. python mobile-hi.codemao.cn_使用thrift做c++,java和python的相互调用

    linux上安装thrift见 http://jinghong.iteye.com/blog/1102535 thrift做为跨语言调用的方案有高效,支持语言较多,成熟等优点:代码侵入较强是其弱点. ...

  5. thrift java长连接_利用thrift在c++、java和python之间相互调用

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

  6. Python+Jpype 调用 Java 碰壁全记录

    因为在Jython 调用 Java 碰壁全纪录中已经有了"出色"碰壁经历,此处仿照其大致过程 命令行下无差异,Eclipse中略有差异(classpath的设置方式不同所致) Ja ...

  7. Python利用JPype调用Java对象方法【实现在Python中调用JAVA】

    一.JPype简述 1.JPype是什么? JPype是一个能够让 python 代码方便地调用 Java 代码的工具,从而克服了 python 在某些领域(如服务器端编程)中的不足. 2.JPype ...

  8. 图像抠图去背景技术从传统算法到深度学习到商用:如何快速使用JAVA/PHP/Python/ShellCommand 实现人像抠图去背景-调用PicUP.AI抠人像接口API实现人像抠图

    图像抠图去背景技术从传统算法到深度学习 图像去背景(抠图)是图像编辑中的关键技术 三分图(trimap)的概念 PicUP.AI [链接](https://www.picup.ai). 实测例子 AP ...

  9. java和python的比较-java学习笔记(与python对比来学)

    写在前头 自己之前一直是从事python的,因为部分业务要求需要进行Java的学习,顺道记录一点笔记. 不同在于Java是偏向编译性的语言,python是解释性语言(下面conner只针对java与p ...

  10. python和java哪个-Python和Java哪个好?有什么区别?

    问题:Python和Java哪个好? 答: Python和java两个都是编程语言,用来操作计算机的一种高级语言,没有好不好,只有是否用对地方. 区别: ·Python入门简单,但如果要用Python ...

最新文章

  1. 27岁的张一鸣教给我们工作上的那些事
  2. Paint.NET 3.0正式版发布了
  3. 凭证 金蝶_金蝶软件账务处理流程之——凭证录入
  4. / ./ ../ 的区别
  5. mysql 控制台环境下查询中文数据乱码,插入、更新中文数据不成功
  6. c# 匿名用戶登錄以後的事件處理
  7. Win10 Anaconda Prompt 快捷方式恢复
  8. JEECG Framework 3.3.1 beta版本发布第一天战报(文档下载量破1300、代码下载量破700)...
  9. 将VMware与SoftICE基于网络的远程调试功能相结合
  10. 利用函数wavread对语音信号进行采样_VoNR与VoLTE实现高清语音的奥秘,就是从小小的采样频率开始...
  11. Linux系统的安装
  12. 字符串函数的模拟实现
  13. RHEL7的DNS服务
  14. superset汉化
  15. 奔跑吧DKY——团队Scrum冲刺阶段-Day 4
  16. 程序员用300行代码,让外婆实现语音搜索购物
  17. 最全的Python网站开发库!整理出来了!
  18. 【入门】广电行业DNS、DHCP解决方案详解(三)——DNS部署架构及案例
  19. java http 用户名密码_Web后端语言模拟http请求(带用户名和密码)实例代码大全
  20. 【Linux驱动】安卓充电芯片bq24735调试详解

热门文章

  1. Facebook界面设计、网络操作系统和SNS大锅饭。
  2. 从源码解析kube-scheduler默认的配置
  3. Vue实现的问题解决方案的查询文库
  4. Leetcode(二):Add Two Numbers
  5. Visual Studio 开源控件扩展 NuGet 常用组件安装命令
  6. rbenv Your user account isn't allowed to install to the system Rubygems
  7. UVA1218 完美的服务 Perfect Service
  8. 洛谷.5283.[十二省联考2019]异或粽子(可持久化Trie 堆)
  9. Ajax异步请求阻塞情况的解决办法(asp.net MVC Session锁的问题)
  10. nginx + tomcat配置负载均衡