java调用python脚本

java调用python脚本

常见的java调用python脚本方式

  • 通过jython.jar提供的类库实现 (不建议使用,因为会报module没有找到的错误,总之就是很蛋疼,要设置一系列的参数)
  • 通过Runtime.getRuntime()开启进程来执行脚本文件(建议使用,原因:简单粗暴我喜欢!!!)在这个里面注意:调用py脚本的时候,先用windows的dos界面去运行下 命令: python xxxx.py,测试,脚本可以调用,不然可能在java脚本就是调用了,但是就是失败了的情况,导致一直卡住,本人就是这样的一个情况。卡了两天。。。。。。

通过jython.jar提供的类库实现

通过jython.jar实现的话,我们需要引入jar包,具体我写了一个demo,假设你的python代码为test.py:

defmy_test(name, age):print("name: "+name)print("age: "+age)return "success"
  • 1
  • 2
  • 3
  • 4

java调用test.py代码:

public static void main(String[] args) {PythonInterpreter interpreter = new PythonInterpreter();  interpreter.execfile("E:\\workspace\\pycharm_workspace\\weixincrawer\\test.py");  PyFunction function = (PyFunction)interpreter.get("my_test",PyFunction.class);  PyObject pyobject = function.__call__(new PyString("huzhiwei"),new PyString("25")); System.out.println("anwser = " + pyobject.toString());  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

输出结果:

name: huzhiwei
age:25
anwser = success
  • 1
  • 2
  • 3

到此是没有什么问题的,我们使用function.call方法传入参数调用python函数,使用pyobject.toString()方法拿到python中my_test函数的返回值,但是如果你把test.py稍微做下修改如下:

import requestsdefmy_test(name, age):response = requests.get("http://www.baidu.com")print("name: "+name)print("age: "+age)return "success"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

不修改java调用代码的情况下,你会得到下面异常信息:

ImportError: No modulenamedrequests
  • 1

没错,这就是我要讨论的问题,因为jython不可能涵盖所有python第三方类库的东西,所以在我们得python文件中用到requests类库的时候,很显然会报找不到模块的错误,这个时候我们是可以通过Runtime.getRuntime()开启进程来执行python脚本文件的。

通过Runtime.getRuntime()开启进程来执行脚本文件

使用这种方式需要同时修改python文件以及java调用代码,在此我同样在上面test.py的基础上进行修改:

import requests
import sysdefmy_test(name, age):response = requests.get("http://www.baidu.com")print("url:"+response.url)print("name: "+name)print("age: "+age)return "success"my_test(sys.argv[1], sys.argv[2])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

和上面test.py代码最大的区别在于,我们此处开启进程的方式实际上是在隐形的调用dos界面进行操作,因此在python代码中我们需要通过sys.argv的方式来拿到java代码中传递过来的参数。

java调用代码部分:

publicstaticvoidmain(String[] args) {String[] arguments = new String[] {"python", "E:\\workspace\\pycharm_workspace\\weixincrawer\\test.py", "huzhiwei", "25"};try {Process process = Runtime.getRuntime().exec(arguments);BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));String line = null;  while ((line = in.readLine()) != null) {  System.out.println(line);  }  in.close();  int re = process.waitFor();  System.out.println(re);} catch (Exception e) {e.printStackTrace();}  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

结果输出:

url:http://www.baidu.com/
name: huzhiwei
age: 25
0
  • 1
  • 2
  • 3
  • 4

在此需要注意的一点,java代码中的process.waitFor()返回值为0表示我们调用python脚本成功,返回值为1表示调用python脚本失败,这和我们通常意义上见到的0与1定义正好相反。

 

 

转载自:https://blog.csdn.net/hzw19920329/article/details/77509497

转载于:https://www.cnblogs.com/di2wu/p/10447242.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425550.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

空间变换方法

空间变换方法可分为简单变换和控制点变换两种方法, 主要介绍了简单变换 法,这里再补充控制点变换方法。 在许多图像处理的应用中,所需的空间变换都很复杂,不是只通过简单的平移、旋转和 缩放等能解决的,而要通过各种不…

[剑指offer][JAVA]面试题第[24]题[反转链表][递归][双指针][头插法]

【问题描述】[中等] 定义一个函数&#xff0c;输入一个链表的头节点&#xff0c;反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL限制&#xff1a;0 < 节点个数 < 5000【解答思路】 1. …

AC自动机模板

const int maxn 1000005;//定义所需要最大长度 struct Aho{struct state{int next[26];//trie树结构int fail,cnt;//失配指针和表示当前点作为结束点的标记}st[maxn];int size;//定义当前一共有多少个点queue<int>q;//层序遍历序列void init(){for(int i0;i<maxn;i){…

【解决问题】useBean类属性[com.cheng.pojo.People]的值无效导致HTTP500问题

先上实体类代码的前半部分&#xff1a; 这是出现问题时的&#xff1a; package com.cheng.pojo;public class People {private int id;private String name;private int age;private String address;public People(int id, String name, int age, String address) {this.id i…

python学习day32 黏包 struct模块

为什么会出现黏包问题&#xff1f; 首先只有在TCP协议中才会出现黏包现象 是因为TCP协议是面向流的协议 在发送的数据 传输过程中 有缓存机制 来避免数据丢失 因此 在连续发送小数据的时候 以及接收大小不符的时候都容易出现黏包现象 本质还是因为我们在接受数据的时候不知道发…

HDU-5935 Car 逆推 贪心 精度

题意 1 主人公从0开始开始跑 2 使用速度非递减技能 3 警察记录下了多个整数时间点他的位置 整数时间点不明确 让我们求主人公所花费的最小时间跨越过最后一个位置点 分析 本体选用逆推处理 为啥用逆推 因为速度是非递减的 如果从前面推 会导致不断重复修改 前面的时间 时间不…

[Leedcode][JAVA][第1300题][转变数组后最接近目标值的数组和][前缀和][二分法][暴力]

【问题描述】[中等] 给你一个整数数组 arr 和一个目标值 target &#xff0c;请你返回一个整数 value &#xff0c;使得将数组中所有大于 value 的值变成 value 后&#xff0c;数组的和最接近 target &#xff08;最接近表示两者之差的绝对值最小&#xff09;。如果有多种使得…

线性系统的基本理论与运算

线性系统的基本理论与运算 线性系统与非线性系统 线性系统的基本理论 二维线性移不变系统 线性移不变系统 如果一个系统既是线性系统&#xff0c;又是移不变系统&#xff0c;则该系 统是线性移不变系统。

行云管家堡垒机 导入腾讯云主机

行云管家堡垒机 导入腾讯云主机 如何实现了对多家云厂商多种云计算资源的集中管理&#xff0c;从成本、监控、备份、安全等多个维度提供统一运维管控&#xff1f; 工具/原料 行云管家堡垒机方法/步骤 Step1&#xff1a;注册登录 登录行云管家&#xff0c;支持QQ、微信、微博、G…

HDU - 5438 Ponds 拓扑 dfs

题意 在一个图中 给出了每个点得权值和连边 想要尽可能删除一些联通的点数小于2的点 删完后 求最后剩下联通块内点得数量是奇数的权值和 分析 本题由于在删除点得过程中需要考虑 当把当前点删除后 其联通的点也有可能会因为当前点得删除而连边小于2同时删除 考虑拓扑排序 建…

(总结)HTTP常见错误返回代码

&#xff08;总结&#xff09;HTTP常见错误返回代码 HTTP返回状态代码 当用户试图通过HTTP或FTP协议访问一台运行主机上的内容时&#xff0c;Web服务器返回一个表示该请求的状态的数字代码。该状态代码记录在服务器日志中&#xff0c;同时也可能在 Web 浏览器或 FTP客户端显示…

MyBatis面试题(2020最新版)

目录MyBatis简介MyBatis是什么&#xff1f;ORM是什么为什么说Mybatis是半自动ORM映射工具&#xff1f;它与全自动的区别在哪里&#xff1f;传统JDBC开发存在的问题JDBC编程有哪些不足之处&#xff0c;MyBatis是如何解决这些问题的&#xff1f;Mybatis优缺点MyBatis框架适用场景…

Java学习笔记9-2——JavaWeb

文章目录JavaBeanMVC三层架构Filter过滤器Listener监听器JDBC文件上传Servlet邮件发送ServletJavaBean 实体类 JavaBean有特定的写法&#xff1a; 必须要有一个无参构造&#xff1b;属性必须私有化&#xff1b;必须有对应的get/set方法&#xff1b; 一般用来和数据库的字段…

linux日常常用命令分析

日志处理&#xff1a;测试网络路由&#xff1a; xargs使用方法&#xff1a;tcpdump命令分析&#xff1a;dd 写入磁盘测试cpu个数&#xff1a;查看网卡流量查看端口联通情况,临时加端口ntpdate同步&#xff1a;可以取出变动的密码&#xff1a;导堆栈&#xff1a;根据进程id查看程…

离散傅立叶变换

离散傅立叶变换 一维离散傅里叶变换 二维离散傅里叶变换(2D-DFT) 、图像傅里叶变换的意义 &#xff08;1&#xff09;简化计算&#xff0c;也即傅里叶变换可将空间域中复杂的卷 积运算转化为频率域中简单的乘积运算。 &#xff08;2&#xff09;对于某些在空间域中难于处理或…

[Leedcode][JAVA][第14题][最长公共前缀][二分][横竖扫描][分治]

【问题描述】[中等] 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀&#xff0c;返回空字符串 ""。示例 1:输入: ["flower","flow","flight"] 输出: "fl" 示例 2:输入: ["dog","raceca…

【模板】在build中配置resources来防止我们资源导出失败的问题

在build中配置resources&#xff0c;来防止我们资源导出失败的问题 <!--在build中配置resources&#xff0c;来防止我们资源导出失败的问题--><build><resources><resource><directory>src/main/resources</directory><includes><…

JDBC_设计架构_驱动类加载_建立Connection_效率测试

JDBC(Java DataBase Connection) 访问数据库流程&#xff1a;驱动管理器--连接数据库--sql语句--结果集 装载mysql驱动 Class.forName("com.jdbc.mysql.Driver"); DriverManager接口是JDBC的管理器&#xff0c;作用于用户和驱动程序之间。 Demo1.java package com.qh…

HDU-4793 Collision 计算几何 解方程

题意 给我们两个大小不同的圆的半径小圆是实心的 大圆是空心的 然后给我们一个小球的半径 小球的初始位置 还有飞碟在x方向和y方向上的速度 小球撞到内实心圆会能量不损失的反弹 问小球任何位置与大圆相交到完全出去的时间是多少 分析 几何题 如何知道时间呢 如果小球与大圆…

图像傅里叶变换频谱分析

图像的傅里叶频谱特性分析 图像傅里叶频谱关于(/&#xff0c;/)的对称性 图像傅里叶频谱特性及其频谱图 傅里叶变换在图像处理中的应用