在做项目的时候,经常会碰到这个问题,主要程序是用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程序代码

  1. import sys
  2. def main(abc):
  3. print(abc)
  4. if __name__ == '__main__':
  5. for i in range(1, len(sys.argv)):
  6. strs = sys.argv[i]
  7. 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. 1.3 Python基础知识 - 用户交互及传递参数

    一.用户交互 用户交互方面,每种开发语言都有不同的方式,例如shell语言用的是,“read -p "What is  your name ? " ”.python中是什么样子的呢 ...

  2. java 调用Spring接口上传文件及其他参数填充

    第一步:在Spring配置中添加以下内容 <!-- 配置MultipartResolver 用于文件上传 使用spring的CommosMultipartResolver --> < ...

  3. java调用ffmpeg获取视频文件信息的一些参数

    一.下载ffmpeg http://www.ffmpeg.org/download.html 主要需要bin目录下的ffmpeg可执行文件 二.java代码实现 package com.aw.util ...

  4. 如何用java发送Http的post请求,并传递参数

    书写方法,请参考以下代码: package utils; import java.io.BufferedReader; import java.io.IOException; import java. ...

  5. java调用python脚本并向python脚本传递参数

    1.安装Eclipse 先安装jdk,再安装Eclipse,成功后开始建立py_java项目,在这个项目的存储目录SRC下建立test包,在test包中New-Class,新建MyDemo类,建好完成 ...

  6. java调用存储过程(stored procedures)的HelloWorld例子

    1.java调用存储过程(stored procedures)的HelloWorld程序 有点数据 库基础的人都知道.存储过程(stored procedures)和java没什么关系.它是一段纯粹的 ...

  7. Runtime.getRuntime().exec()实现Java调用python程序

    使用Runtime.getRuntime().exec()来实现Java调用python,调用代码如下所示: import java.io.BufferedReader; import java.io ...

  8. 【Python】Java程序员学习Python(五)— 函数的定义和使用

    不想做一个待宰的羔羊!!!!要自己变得强大.... 函数的定义和使用放在最前边还是有原因的,现在语言趋于通用,基本类型基本都是那些,重点还是学习对象的使用方法,而最根本的还是方法的使用,因此优先介绍, ...

  9. 前端,Java,产品经理,微信小程序,Python等资源合集大放送

    为了感恩大家长久以来的关注和支持,小编准备了一些福利,整理了包含前端,Java,产品经理,微信小程序,Python,网站源码,Android应用视频教程,微信公众平台开发教程及材料等资源合集大放送. ...

随机推荐

  1. C++雾中风景9:emplace_back与可变长模板

    C++11的版本在vector容器添加了emplace_back方法,相对于原先的push_back方法能够在一定程度上提升vector容器的表现性能.所以我们从STL源码角度来切入,看看这两种方法有 ...

  2. java的classpath路径中加点号 ‘.’ 的作用

    "."表示当前目录,就是编译或者执行程序时你所在的目录下的.class文件:而JAvA_HOME表示JDK安装路径 该路径在eclipse中是以vmarg的形式传入的,可以在任务管 ...

  3. 在MFC中UpdateData()的作用

    UpdateData()用来刷新数据,其中UpdateData(true)将控件中的数据传递到控件捆绑的变量中去.UpdateData(false)将变量值传递到控件中去.例如:窗口中用 DDX_Te ...

  4. [NOI赛前训练]——专项测试3·数学

    由于并不想写T1和T2的题解……所有只有T3的题解了. T3 由于内部题就只写题解了. 好吧,我是一点都不想写…… 说一下这zz题解哪里写错了吧…… ……不想写…… 就说一个吧…… $n-\frac{ ...

  5. 51nod1172 Partial Sums V2

    推一下式子发现是裸的FFT,$ans[k]=\sum_{i}\sum_{j}[i+j=k]a[i]*C_{m-1+j}^{j}$ 比较坑爹的就是这个模数,于是我们上任意模数的FFT 任意模数的FFT目 ...

  6. BZOJ_4813_[Cqoi2017]小Q的棋盘_dfs

    BZOJ_4813_[Cqoi2017]小Q的棋盘_dfs Description 小Q正在设计一种棋类游戏.在小Q设计的游戏中,棋子可以放在棋盘上的格点中.某些格点之间有连线,棋子只能 在有连线的格 ...

  7. 防XXS和SQL注入

    对网站发动XSS攻击的方式有很多种,仅仅使用php的一些内置过滤函数是对付不了的,即使你将filter_var,mysql_real_escape_string,htmlentities,htmlsp ...

  8. UML用法及状态图,活动图介绍

    统一建模语言UML(Unified Modeling Language)是非专利的第三代建模和规约语言.UML是一种开放的方法,用于说明.可视化.构建和编写一个正在开发的.面向对象的.软件密集系统的制 ...

  9. 系统的讲解 - PHP WEB 安全防御

    目录 常见漏洞 SQL注入攻击 XSS攻击 SSRF攻击 CSRF攻击 文件上传漏洞 信息泄露 越权 设计缺陷 小结 常见漏洞 看到上图的漏洞是不是特别熟悉,如果不进行及时防御,就会产生蝴蝶效应. 往 ...

  10. mariaDB vs mysql

    mariaDB vs mysql 今天遇到一个库使用的是mariaDB的数据库版本 Server version: 10.1.20-MariaDB MariaDB Server 理了一下mariaDB ...