在做项目的时候,经常会碰到这个问题,主要程序是用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. charles模拟手机流量网速

    找到proxy--throttle settings 勾选enable throttling,设置手机上网网速 选择throttle preset,有设置好的一些网速,可以随便选 也可以设置2G网络, ...

  2. selenium--unittest 框架/selenium--常见异常

    selenium常见异常 from selenium import webdriver from selenium.webdriver.common.by import By from seleniu ...

  3. python selenium-webdriver 元素操作之键盘操作

    selenium 提供了比较完整的键盘操作,在使用的模拟键盘操作之前需要我们导入from selenium.webdriver.common.keys import Keys即可,然后就可以来模拟键盘 ...

  4. IDEA破解 Intellij IDEA license server 激活(可用)

    激活地址如下图所示: 2018 intellij idea 注册码(亲测可用): C0FHYYCJ22-eyJsaWNlbnNlSWQiOiJDMEZIWVlDSjIyIiwibGljZW5zZWVO ...

  5. I/O-----字节输入流

    package io.day03; import java.io.FileInputStream; import java.io.InputStream; public class day03 { p ...

  6. top_channel_args.go

    , fmt.Sprintf("%s: closing %s", proto, listener.Addr())) }

  7. ANSI 和 UNICODE 的函数对应表

    ANSI        UNICODE           通用(char.h)    (wchar.h)        (tchar.h) char         wchar_t         ...

  8. bzoj3811 玛里苟斯

    分三种情况讨论 k=1时,对于每一位而言,只要有一个数这一位是1,那么这个就有0.5的概率是1,选他就是1,不选就是0,有第二个的话,在第一个选或不选的前提下,也各有0.5的几率选或不选,0和1的概率 ...

  9. 【强连通分量+spfa】Bzoj1179 Apio2009 Atm

    Description Solution 显然缩强连通分量,然后求最长路,虽然是DAG但还是有点麻烦,于是用了spfa. Code 重建图_数组写错好多次,感觉做这题也就是练了一下实现. #inclu ...

  10. Django 项目搭建(ubuntu系统)

    1 环境搭建 sudo apt-get install python3-pip 安装pip3 sudo pip3 install virtualenv 安装虚拟环境,这里展示virtualenv vi ...