本篇文章涉及到的操作均在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. 十九款web漏洞扫描工具

    1. Arachni Arachni是一款基于Ruby框架搭建的高性能安全扫描程序,适用于现代Web应用程序.可用于Mac.Windows及Linux系统的可移植二进制文件. Arachni不仅能对基 ...

  2. 转:HR schema

    ###createe RemRem $Header: hr_cre.sql 29-aug-2002.11:44:03 hyeh Exp $RemRem hr_cre.sqlRemRem Copyrig ...

  3. 复习sql server 2000 MSDE2000 ,安装,打补丁,开1433端口。

    前言: 由于工作需要,一个仍在使用的古董软件需要安装配置. 原有系统是在主机部署,单机安装sql2000,其他机器(分机)也单机部署软件,部署sql2000,通过dtsrun /f sync.dts( ...

  4. 【JQuery插件】扑克正反面翻牌效果

    里面有两个demo,支持X横向和Y纵向翻转两个效果. 对元素的布局有一定的讲究,需要分析一下demo的css. 默认翻转速度为80,不要大于100ms. <!DOCTYPE> <ht ...

  5. NB-IOT技术 UP模式 和CP模式,用户面和控制面,数据面

    先看下面的图 UE就是NB-IOT设备,那么UE的数据到应用服务器有3条路可以走 第一条,UE,基站,MME,SCEF,应用服务器,这个是CP模式,也叫控制面,也叫信令无线承载面,也叫控制面承载,叫法 ...

  6. mac的公式编辑器: mathtype/latex

    mathtype 收费版,且马上不能在mac系统上使用 latex 搜索一下: ➜ ~ brew search latex ==> Formulae gnome-latex latex2html ...

  7. [转帖]鲁大师Q3季度PC处理器排行:AMD、Intel终于五五开了

    鲁大师Q3季度PC处理器排行:AMD.Intel终于五五开了 https://www.cnbeta.com/articles/tech/902375.htm 近日,鲁大师发布了Q3季度PC处理器排行. ...

  8. [转帖]MyCat教程【简单介绍】

    MyCat教程[简单介绍] 2019-10-15 10:27:23 波波烤鸭 阅读数 618 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. ...

  9. Mkdown常用语法

    这篇笔记停了两天,今天开始整理, 写这篇笔记主要是加强下自己的mkdown语法知识, 也当作练手之作. Mkdown 语法简介 标题 [h1 - h6] # ~ ###### 一般# 作为标题, 只有 ...

  10. SQL映射器Mapper接口(MyBatis)

    SQL映射器Mapper接口 MyBatis基于代理机制,可以让我们无需再写Dao的实现.直接把以前的dao接口定义成符合规则的Mapper. 注意事项: 1.接口必须以Mapper结尾,名字是Dom ...