本篇文章涉及到的操作均在Windows系统下进行,Java调用python在原理上不难,但是可能在实际应用中会有各种各样的需求,网上其他的资料很不全,所以又总结了这篇文章,以供参考。

一、指定python运行环境

首先,如果是python脚本中需要用到第三方库,则最好要用Runtime.getRuntime().exec的方法来从Java中调用python,本文章也都是基于这种方法,这也相当于是在控制台通过语句来调用python文件;其次,实际使用的时候经常会需要调用不同的python环境,比如python2.x和3.x,不同的python运行环境安装了不同的库,对应着不同的python脚本,这个时候就需要在Java调用语句中指定python环境了。

一般情况下,是不指定python环境,而通过以下几句来调用python文件:

 String pyPath = "E:\\CalCentralFeature.py"; //python文件路径
String[] args = new String[] { "python", pyPath}; //设定命令行
try {
Process proc = Runtime.getRuntime().exec(args); //执行py文件
BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
in.close();
proc.waitFor();
} catch (Exception e) {
e.printStackTrace();
}

由于设定命令行部分没有指定具体的python环境,所以运行的时候会调用系统默认的python环境,也就是添加到系统环境变量中的python。查看系统默认python版本,可以在cmd中直接键入python回车即可。

如果需要指定python运行环境,则需要在设定命令行部分进行更改,比如我的系统默认python是2.7的,而我其他地方安装了python3.7,里面已经安装好了需要的第三方库,需要Java中调用python文件时指定运行环境是这个python3.7。那么只需将上面的第二行更改如下:

 String[] args = new String[] { "F:\\Program Files\\Python37\\python", pyPath};

python3.7安装路径如下图所示:

下面的调用函数还都是一样,这样即可指定python的运行环境。

二、传入参数

在Java中调用python时如果需要传入参数,则还是通过更改String[] args = new String[]这句函数,将参数添加在后面即可,比如:

 String[] args = new String[] { "F:\\Program Files\\Python37\\python", pyPath, data1,data2};

这样就是传入了data1和data2两个运行参数,当然运行参数个数不限。

在Java中设定好了之后,还需要在python文件中做相应更改:

 import sys

 def cal_central_feature(x,y):
x_records = BaseFunction.get_attr_records(sf,x)
y_records = BaseFunction.get_attr_records(sf,y)
........... if __name__ == '__main__':
result = cal_central_feature(sys.argv[1],sys.argv[2])

首先是需要引用sys,传入的参数用sys.argv[1]、sys.argv[2]表示。其中需要注意的是接收参数从sys.argv[1]开始,sys.argv[0]是python脚本的参数地址,没有实际作用。

三、返回结果

Java调用python时,不能通过return语句来获取返回值,而只能通过print将结果写入到标准输出流中,然后在Java中通过标准输入流来读取到返回结果。

因此,如果想得到返回结果,就需要在python文件中做修改,通过print函数将需要的结果返回到Java程序中。

python中的示例如下:

 if __name__ == '__main__':
result = cal_central_feature(sys.argv[1],sys.argv[2])
print(result[0])
print(result[1])

这样就是返回了result[0]和result[1]两个返回值,在Java中通过如下语句得到返回值:

 String result = null;
try {
Process proc = Runtime.getRuntime().exec(args); //执行py文件
BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line);
result += line;
}
in.close();
proc.waitFor();
} catch (Exception e) {
e.printStackTrace();
}

其中第7行表示将结果打印出来,第8行表示将结果保存到string中。

至此,在Java中调用python的相关问题都已描述清楚。

Java调用Python相关问题:指定python环境、传入参数、返回结果的更多相关文章

  1. java调用支付宝 支付api 【沙箱环境】

    由于支付宝支付api需要各种备案,但学校项目需要引入支付功能  先演示  ,所以采用 沙箱环境 一.登录支付宝 开放平台 及配置相关 https://openhome.alipay.com/platf ...

  2. Java调用动态链接库so文件(传参以及处理返回值问题)

    刚来到公司,屁股还没坐稳,老板把我叫到办公室,就让我做一个小程序.我瞬间懵逼了.对小程序一窍不通,还好通过学习小程序视频,两天的时间就做了一个云开发的小程序,但是领导不想核心的代码被别人看到,给了我一 ...

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

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

  4. java read读取方法 之 指定读取大小,根据返回值判断是否读取所有的内容 -1表示读取完毕

    当读取的内容小于指定的长度时候 字符数组里面会出现一部分字符是上一次遗留下来的情况

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

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

  6. python 传入参数返回的时候好像有些时候会出现莫名其妙的循环

    def handle_field(name, s_len, s): #some code #return s would error but return not.... #return s for ...

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

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

  8. windows和linux环境下java调用C++代码-JNI技术

    最近部门做安卓移动开发的需要调C++的代码,困难重重,最后任务交给了我,查找相关资料,没有一个教程能把不同环境(windows,linux)下怎么调用说明白的,自己在实现的过程中踩了几个坑,在这里总结 ...

  9. 巧用C#做中间语言 实现Java调用.net DLL

    本文将详细为大家介绍一个java调用.net DLL的方法,以实现特殊的客户的特殊要求:“在Java项目中必须使用其提供的用.net写的DLL加密机制!” 环境与工具: ◆.net framework ...

随机推荐

  1. 【PHP】php7.2报错The each() function is deprecated. This message will be suppressed on furthe

    php7.2以上 废除了 each()方法,项目中用到的地方会出现以下报错 The each() function is deprecated. This message will be suppre ...

  2. maven 引入的jar有出现两种图标

    两种同样都引入到maven项目中,但是第二种在打包的过程中会显示找不到jar,无法调用!

  3. 改进初学者的PID-积分饱和

    最近看到了Brett Beauregard发表的有关PID的系列文章,感觉对于理解PID算法很有帮助,于是将系列文章翻译过来!在自我提高的过程中,也希望对同道中人有所帮助.作者Brett Beaure ...

  4. 【计算机视觉】图像配准(Image Registration)

    (Source:https://blog.sicara.com/image-registration-sift-deep-learning-3c794d794b7a)  图像配准方法概述 图像配准广泛 ...

  5. 正则表达式\s空格,\d数字,量词+*?测试

    之前的博文中: 有正则表达式的\b.i.\g,本文再测试了空格数字和量词的匹配.这篇只测试匹配,不替换或其他处理.\s空格:测试实际写空格也能识别,但是不利于看出空了几个空格,可以用\s代表空格.\d ...

  6. 最新CSS兼容方案

    CSS兼容方案,让你的样式完美兼容各大浏览器,这个方案主要是用来解决Safari的,Opear是在测试的时候顺带试了一下,结果发现竟然也行,所以顺便也解决了. .e {/*FF OP*/ color: ...

  7. git 版本控制中回溯到某个历史版本

    1.git log 查看之前的版本号 2. git reset --hard 版本号 3.git push -f -u origin 分支 恢复上一个版本是: git reset --hard HEA ...

  8. const的用法及它在C语言和C++中的不同

    (1)可以定义const常量. (2)Const可以修饰函数的参数和返回值,甚至定义体.被const修饰的东西都受到强制保护. (3)Const修饰成员函数时,用于成员函数前面,则返回值不能作为左值. ...

  9. vue打包静态资源后显示空白及static文件路径报错

    1.打包之后打开dist的页面显示空白: 这个是打包项目比较常见的一个错误 改一下config下面的index.js中bulid模块导出的路径.因为打包后的index.html里边的内容都是通过scr ...

  10. centos 用户组操作

    adduser testuser //新建testuser 用户 passwd testuser //给testuser 用户设置密码 useradd -g testgroup testuser // ...