java调用python程序以及向python程序传递参数
在做项目的时候,经常会碰到这个问题,主要程序是用java写的,有些功能使用python写的,整个项目需要把java代码和python代码进行整合,在一个项目里面运行,这就涉及到java调用python的问题。
1 一个解决思路是在java项目中引入jython,然后使用python解释器运行jython代码,实例代码如下:
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.exec("XXX ");
XXX代表要运行的jython代码,jython有python的库,但不是特别全,如果python程序引入的库比较多,这种方式可能不能解决问题。
2 另一种方式就是在java程序中直接调用python程序,这样无论python程序引入什么样的库(模块),只要程序可以直接通过python xxx.py运行,则在Java程序中也能运行。下面重点介绍在Java中直接调用python程序的方法。
2.1 Python程序代码
- import sys
- def main(abc):
- print(abc)
- if __name__ == '__main__':
- for i in range(1, len(sys.argv)):
- strs = sys.argv[i]
- main(strs)
程序目录名称为D:/pyworkspace/main.py,函数main有参数,参数通过sys传入,也就是在java中定义好参数,然后通过sys,将参数传给main函数,把参数打印出来。
2.2 Java程序代码
1.import java.io.BufferedReader;
2.import java.io.IOException;
3.import java.io.InputStreamReader;
4.public class Main {
5.
6. public static void main(String[] args) {
7.
8. // TODO Auto-generated method stub
9. Process proc;
10. try {
11. String[] args1 = new String[] { "python", "D:\\pyworkspace\\main.py", "hello,test java and python"};
12. proc=Runtime.getRuntime().exec(args1);
13. //用输入输出流来截取结果
14. BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
15. String line = null;
16. while ((line = in.readLine()) != null) {
17. System.out.println(line);
18. }
19. in.close();
20. proc.waitFor();
21. } catch (IOException e) {
22. e.printStackTrace();
23. } catch (InterruptedException e) {
24. e.printStackTrace();
25. }
26.
27. }
28.}
可以看到核心代码就是
String[] args1 = new String[] { "python", "D:\\pyworkspace\\main.py", "hello,test java and python"};
proc=Runtime.getRuntime().exec(args1);
Runtime.getRuntime().exec()的参数是一个字符串数组,相当于执行
python D:/pyworkspace/main.py,
往main.py中传递参数"hello,test java and python"。
2.3 运行结果

3 一些注意的问题
3.1 要保证在命令行模式下,键入命令
python D:/pyworkspace/main.py
程序可以正常运行。也就是要保证有一个配置好的python环境。这个示例程序比较简单,如果是一个比较复杂的python项目,可能涉及到的模块比较多,用到的库也很多,需要将python环境配置完整,先在命令行下运行,无误后再在java程序中调用。
3.2 java中的核心代码,Runtime.getRuntime().exec(),如果python的入口函数不需要参数的话,可以直接将调用py文件的字符写入,示例
Runtime.getRuntime().exec(“python”,” D:\\pyworkspace\\main.py”)
4 参考资料
https://www.cnblogs.com/bethansy/p/7614749.html
https://blog.csdn.net/quliuwuyiz/article/details/79366897
https://www.cnblogs.com/mingforyou/p/3551199.html
java调用python程序以及向python程序传递参数的更多相关文章
- 1.3 Python基础知识 - 用户交互及传递参数
一.用户交互 用户交互方面,每种开发语言都有不同的方式,例如shell语言用的是,“read -p "What is your name ? " ”.python中是什么样子的呢 ...
- java 调用Spring接口上传文件及其他参数填充
第一步:在Spring配置中添加以下内容 <!-- 配置MultipartResolver 用于文件上传 使用spring的CommosMultipartResolver --> < ...
- java调用ffmpeg获取视频文件信息的一些参数
一.下载ffmpeg http://www.ffmpeg.org/download.html 主要需要bin目录下的ffmpeg可执行文件 二.java代码实现 package com.aw.util ...
- 如何用java发送Http的post请求,并传递参数
书写方法,请参考以下代码: package utils; import java.io.BufferedReader; import java.io.IOException; import java. ...
- java调用python脚本并向python脚本传递参数
1.安装Eclipse 先安装jdk,再安装Eclipse,成功后开始建立py_java项目,在这个项目的存储目录SRC下建立test包,在test包中New-Class,新建MyDemo类,建好完成 ...
- java调用存储过程(stored procedures)的HelloWorld例子
1.java调用存储过程(stored procedures)的HelloWorld程序 有点数据 库基础的人都知道.存储过程(stored procedures)和java没什么关系.它是一段纯粹的 ...
- Runtime.getRuntime().exec()实现Java调用python程序
使用Runtime.getRuntime().exec()来实现Java调用python,调用代码如下所示: import java.io.BufferedReader; import java.io ...
- 【Python】Java程序员学习Python(五)— 函数的定义和使用
不想做一个待宰的羔羊!!!!要自己变得强大.... 函数的定义和使用放在最前边还是有原因的,现在语言趋于通用,基本类型基本都是那些,重点还是学习对象的使用方法,而最根本的还是方法的使用,因此优先介绍, ...
- 前端,Java,产品经理,微信小程序,Python等资源合集大放送
为了感恩大家长久以来的关注和支持,小编准备了一些福利,整理了包含前端,Java,产品经理,微信小程序,Python,网站源码,Android应用视频教程,微信公众平台开发教程及材料等资源合集大放送. ...
随机推荐
- goroutine背后的系统知识
http://www.sizeofvoid.net/goroutine-under-the-hood/ o语言从诞生到普及已经三年了,先行者大都是Web开发的背景,也有了一些普及型的书籍,可系统开发背 ...
- fixed 和 absolute 定位的区别
fixed:固定定位 absolute:绝对定位 在没有滚动条的情况下两者其实没有差异.但是在有滚动条后,fixed始终会在定好的位置不动,而absolute会随参照对象元素的宽高 ...
- QM4_Probability
Basic Concepts Probability concepts Terms Random variable A quantity whose possible values are uncer ...
- composer的安装方法
网上说的方法几乎都不正确,经作者总结,终于知道怎么使用composer的方法.第一,从http://docs.phpcomposer.com/下载安装包:composer.phar 第二,把安装包放在 ...
- 【组合数学】Bzoj2916 [Poi1997]Monochromatic Triangles
Description 空间中有n个点,任意3个点不共线.每两个点用红线或者蓝线连接,如果一个三角形的三边颜色相同,那么称为同色三角形.给你一组数据,告诉你哪些点间有一条红线,计算同色三角形的总数. ...
- 启动VMware虚拟机时总是出现许可证到期提示怎么办?
不知道大家有没有遇到过这个问题,每次当你打开VMware虚拟机时它总是会提示许可证到期,需要注册,还会出现许多报红的代码,下面就让小编带大家解决一下吧~ VMware教程 如果Fusion本身无法启动 ...
- 你真的了解ASP.NET Core 部署模型吗?
---------------------------- 以下内容针对 ASP.NET Core2.1,2.2出现IIS进程内寄宿 暂不展开讨论-------------------------- ...
- Python中os和sys模块中常用的方法
os模块 os模块:该模块提供了一些方便使用操作系统相关功能的函数 os.remove() 删除文件 os.rename() 重命名文件 os.walk() 文件目录遍历器 os.chdir() 改变 ...
- [小技巧]EF Core中如何获取上下文中操作过的实体
原文地址:https://www.cnblogs.com/lwqlun/p/10576443.html 作者:Lamond Lu 源代码:https://github.com/lamondlu/EFC ...
- 微信小程序之表单验证
表单验证 何为表单验证呢? 百度百科给出的回答是这样的: 表单验证是javascript中的高级选项之一.JavaScript 可用来在数据被送往服务器前对 HTML 表单中的这些输入数据进行验证 [ ...