java 如何调用Python文件包括传参

 更新时间:2021年04月23日 11:40:46   作者:一起喜羊羊  
这篇文章主要介绍了java 调用Python文件包括传参的实现方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

最近在和我的小伙伴们做一个物体识别的小程序,主要是他通过深度学习,然后训练出了一个模型,只要向模型传图片的路径,即可得到识别的结果,

然后我主要负责做服务器和通过java调用他的模型,简单的说就是在java环境下调用Python脚本,

主要有两个方式

第一个是通过jython,这个方法不太好用,当Python用到第三方库的时候,由于jython不可能涵盖所有python第三方类库,

所以建议用第二种Runtime.getRuntime()开启进程来执行python脚本文件

String[] arguments = new String[] {"python","D:\\ccc\\1.py",str};//指定命令、路径、传递的参数
        try {
         Writer out = response.getWriter(); //获得HttpServletResponse输出流对象
            Process process = Runtime.getRuntime().exec(arguments);//开启进程来执行脚本文件
            BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));//获取字符输入流对象
            String line = null;  
          while ((line = in.readLine()) != null) {  
              JSONArray Resulet = JSONArray.fromObject(util.DataHandle(line.toString()));//读取到结果(一行文字)进行数据处理
              String json = Resulet.toString();
              out.write(json);//使用输出流对象向小程序发送字符数据
          }  
          out.close();
          in.close();  
        } catch (Exception e) {
            e.printStackTrace();
        }

第一行代码传递的参数str就是图片的路径(我这实例代码只传递一个参数,如果传递多个参数直接在str,后面加,格式都是一样,Python代码接收参数也是不一样,接着往下看),剩下的代码我都上了注释

from keras.models import load_model
import numpy as np
from keras.preprocessing import image
import sys
import re
def predict(pic_dir):
    model = load_model("D:/ccc/model.h5")
    images = image.load_img(pic_dir, target_size=(32,32))
    images = image.img_to_array(images)
    images = np.expand_dims(images, axis=0)
    images=np.array(images,dtype=int)
    images_normalize=images.astype("float32")/255.0    
    pre_y=model.predict(images_normalize)
    pre_y=pre_y.reshape(-1)
    np.set_printoptions(suppress=False)   
    pre_y=[pre_y[i]*100 for i in range(len(pre_y))]
    pre_y=[str(pre_y[i]) for i in range(len(pre_y))]    
    for i in range(len(pre_y)):
        if pre_y[i].find('e',0,len(pre_y[i]))!=-1:
            wei=int(pre_y[i][len(pre_y[i])-1])-1
            pre_y[i]=re.sub(r'e-.*$','',pre_y[i])
            pre_y[i]=re.sub(r'[^0-9]','',pre_y[i])
            for j in range(0,wei):
                    pre_y[i]='0'+pre_y[i]
            pre_y[i]='0'+'.'+pre_y[i]        
    pre_y=[pre_y[i]+"%" for i in range(len(pre_y))]
    return pre_y
prediction=predict(sys.argv[1])
print(prediction)

上面是Python代码,prediction=predict(sys.argv[1])代码里面的sys.argv[1]就是接收传递过来的参数str,如果多个参数就以此类推接收

小程序接收到数据并输出到控制台

然后就是显示数据,给我小伙伴的深度学习点个赞!准确率还是挺高的

补充:Java调用Python文件

有时候我们想要通过java调用一个python文件,而这个python文件又必须在特定的virtualenv虚拟环境下才能运行。如果直接将这个python文件所需要的包安装到python系统环境下难免有些暴力

我想到了如下方法解决这个问题:

创建虚拟环境后,如果虚拟环境的文件夹叫做env,我们平时激活虚拟环境的命令是 source env/bin/activate 。在bin目录中还有一个文件叫做activate_this.py,我们通过这个文件切换到虚拟环境,在一个python文件(假设叫a.py)中调用该文件(activate_this.py),再书写想要调用的目标python文件,再由Java调用a.py即可完成指定虚拟环境下的python文件调用。

python文件名为a.py,代码如下

import os
activate_this = 'path/to/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))
os.system("python target.py")

java代码

import java.io.BufferedReader;
import java.io.InputStreamReader; 
public class Test {
 public static void main(String[] args) {
  try {
   System.out.println("start");
   Process pr = Runtime.getRuntime().exec("python /home/kui/桌面/a.py");
   BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream()));
   String line;
   while ((line = in.readLine()) != null) {
    System.out.println(line);
   }
   in.close();
   pr.waitFor();
   System.out.println("end");
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}
 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

相关文章

  • Java中 ? extends T 和 ? super T的理解

    Java中 ? extends T 和 ? super&nb

    本文主要介绍了Java中 ? extends T 和 ? super T的理解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • SpringBoot中使用Ehcache的详细教程

    SpringBoot中使用Ehcache的详细教程

    EhCache 是一个纯 Java 的进程内缓存框架,具有快速、精干等特点,是 Hibernate 中默认的 CacheProvider。这篇文章主要介绍了SpringBoot中使用Ehcache的相关知识,需要的朋友可以参考下
    2020-08-08
  • java中Calendar.add()方法的使用

    java中Calendar.add()方法的使用

    本文主要介绍了java中Calendar.add()方法的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 浅谈java获取UUID与UUID的校验

    浅谈java获取UUID与UUID的校验

    这篇文章主要介绍了java获取UUID与UUID的校验,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • 你真的会使用Java的方法引用吗

    你真的会使用Java的方法引用吗

    这篇文章主要给大家介绍了关于Java方法引用的相关资料,方法引用是Java8的新特性,方法引用其实也离不开Lambda表达式,本文通过示例代码介绍的很详细,需要的朋友可以参考下
    2021-08-08
  • Spring中@Autowired注解的原理详解

    Spring中@Autowired注解的原理详解

    这篇文章主要介绍了Spring中@Autowired注解的原理详解,对于spring配置一个bean时,如果需要给该bean提供一些初始化参数,则需要通过依赖注入方式,所谓的依赖注入就是通过spring将bean所需要的一些参数传递到bean实例对象的过程,需要的朋友可以参考下
    2023-11-11
  • Java 爬虫服务器被屏蔽的解决方案

    Java 爬虫服务器被屏蔽的解决方案

    这篇文章主要介绍了Java 爬虫服务器被屏蔽的解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Java遍历Map对象集合的六种方式代码示例

    Java遍历Map对象集合的六种方式代码示例

    Java中的Map是一种键值对映射的数据结构,它提供了一些常用的方法用于获取、添加、删除和修改元素,下面这篇文章主要给大家介绍了关于Java遍历Map对象集合的六种方式,需要的朋友可以参考下
    2024-02-02
  • Java抢红包的红包生成算法

    Java抢红包的红包生成算法

    现在日常生活中抢红包已经成了日常游戏,本篇文章主要介绍了Java抢红包的红包生成算法,具有一定的参考价值,有需要的可以了解一下。
    2016-11-11
  • JAVA Spring中让人头痛的JAVA大事务问题要如何解决你知道吗

    JAVA Spring中让人头痛的JAVA大事务问题要如何解决你知道吗

    这篇文章主要介绍了Java Spring事务使用及验证过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-09-09

最新评论