java和python互相调用
转自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环境类
- 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互相调用相关推荐
- java和python可以在一个项目中同时使用么-java调用python的几种用法(看这篇就够了)...
java调用python的几种用法如下: 在java类中直接执行python语句 在java类中直接调用本地python脚本 使用Runtime.getRuntime()执行python脚本文件(推荐 ...
- Java如何跨语言调用Python/R训练的模型
在 如何使用sklearn进行在线实时预测(构建真实世界中可用的模型) 这篇文章中,我们使用 sklearn + flask 构建了一个实时预测的模型应用.无论是 sklearn 还是 flask,都 ...
- java执行python返回null_[转]java调用python脚本以及通过Process.waitFor()直接调用python模块返回错误代码1的一种解决办法...
常见的java调用python脚本方式 通过jython提供的类库实现 通过Runtime.getRuntime()开启进程来执行脚本文件 通过jython提供的类库实现 通过jython实现的话,我 ...
- python mobile-hi.codemao.cn_使用thrift做c++,java和python的相互调用
linux上安装thrift见 http://jinghong.iteye.com/blog/1102535 thrift做为跨语言调用的方案有高效,支持语言较多,成熟等优点:代码侵入较强是其弱点. ...
- thrift java长连接_利用thrift在c++、java和python之间相互调用
转自:http://blog.csdn.net/andy_yf/article/details/7487384 thrift做为跨语言调用的方案有高效,支持语言较多,成熟等优点:代码侵入较强是其弱点. ...
- Python+Jpype 调用 Java 碰壁全记录
因为在Jython 调用 Java 碰壁全纪录中已经有了"出色"碰壁经历,此处仿照其大致过程 命令行下无差异,Eclipse中略有差异(classpath的设置方式不同所致) Ja ...
- Python利用JPype调用Java对象方法【实现在Python中调用JAVA】
一.JPype简述 1.JPype是什么? JPype是一个能够让 python 代码方便地调用 Java 代码的工具,从而克服了 python 在某些领域(如服务器端编程)中的不足. 2.JPype ...
- 图像抠图去背景技术从传统算法到深度学习到商用:如何快速使用JAVA/PHP/Python/ShellCommand 实现人像抠图去背景-调用PicUP.AI抠人像接口API实现人像抠图
图像抠图去背景技术从传统算法到深度学习 图像去背景(抠图)是图像编辑中的关键技术 三分图(trimap)的概念 PicUP.AI [链接](https://www.picup.ai). 实测例子 AP ...
- java和python的比较-java学习笔记(与python对比来学)
写在前头 自己之前一直是从事python的,因为部分业务要求需要进行Java的学习,顺道记录一点笔记. 不同在于Java是偏向编译性的语言,python是解释性语言(下面conner只针对java与p ...
- python和java哪个-Python和Java哪个好?有什么区别?
问题:Python和Java哪个好? 答: Python和java两个都是编程语言,用来操作计算机的一种高级语言,没有好不好,只有是否用对地方. 区别: ·Python入门简单,但如果要用Python ...
最新文章
- 27岁的张一鸣教给我们工作上的那些事
- Paint.NET 3.0正式版发布了
- 凭证 金蝶_金蝶软件账务处理流程之——凭证录入
- / ./ ../ 的区别
- mysql 控制台环境下查询中文数据乱码,插入、更新中文数据不成功
- c# 匿名用戶登錄以後的事件處理
- Win10 Anaconda Prompt 快捷方式恢复
- JEECG Framework 3.3.1 beta版本发布第一天战报(文档下载量破1300、代码下载量破700)...
- 将VMware与SoftICE基于网络的远程调试功能相结合
- 利用函数wavread对语音信号进行采样_VoNR与VoLTE实现高清语音的奥秘,就是从小小的采样频率开始...
- Linux系统的安装
- 字符串函数的模拟实现
- RHEL7的DNS服务
- superset汉化
- 奔跑吧DKY——团队Scrum冲刺阶段-Day 4
- 程序员用300行代码,让外婆实现语音搜索购物
- 最全的Python网站开发库!整理出来了!
- 【入门】广电行业DNS、DHCP解决方案详解(三)——DNS部署架构及案例
- java http 用户名密码_Web后端语言模拟http请求(带用户名和密码)实例代码大全
- 【Linux驱动】安卓充电芯片bq24735调试详解
热门文章
- Facebook界面设计、网络操作系统和SNS大锅饭。
- 从源码解析kube-scheduler默认的配置
- Vue实现的问题解决方案的查询文库
- Leetcode(二):Add Two Numbers
- Visual Studio 开源控件扩展 NuGet 常用组件安装命令
- rbenv Your user account isn't allowed to install to the system Rubygems
- UVA1218 完美的服务 Perfect Service
- 洛谷.5283.[十二省联考2019]异或粽子(可持久化Trie 堆)
- Ajax异步请求阻塞情况的解决办法(asp.net MVC Session锁的问题)
- nginx + tomcat配置负载均衡