如何在Java中调用python文件执行详解

目录
  • 一、Java内置Jpython库(不推荐)
    • 1.1 下载与使用
    • 1.2 缺陷
  • 二、使用Runtime.getRuntime()执行脚本⽂件
    • 2.1 使用
    • 2.2 缺陷
  • 三、利用cmd调用python文件
    • 3.1 使用
    • 3.2 优化
  • 总结

一、Java内置Jpython库(不推荐)

1.1 下载与使用

可以在官网下载jar包,官网:http://ftp.cuhk.edu.hk/pub/packages/apache.org/

或者使用maven进行jar包下载

<dependency>
    <groupId>org.python</groupId>
    <artifactId>jython-standalone</artifactId>
    <version>2.7.0</version>
</dependency>

执行代码样例:

PythonInterpreter interpreter = new PythonInterpreter();
interpreter.exec("a=[5,2,3,9,4,0]; ");
interpreter.exec("print(sorted(a));");

1.2 缺陷

Jython内置的库有限,而且很多库不存在,会报no model的错误,所以这里不推荐大家使用。

二、使用Runtime.getRuntime()执行脚本⽂件

2.1 使用

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

publicclass Demo1 {
publicstaticvoid main(String[] args) {
        Process proc;
        // 编译器是python
        String exe = "python";
        // py文件存的绝对路径
        String path = "D:\\NLP.py";
        // 传入的参数
        String args = "今天过的很开心";

		try {
            proc = Runtime.getRuntime().exec(exe + ' ' + path + ' ' + 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 (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

2.2 缺陷

如果在你的python中,会使用自己包中的其他python文件中的函数,那么很有可能无法导入,但是不会报错,只会返回一个null。

三、利用cmd调用python文件

3.1 使用

这个方法就类似于在cmd中,使用 python file.py 参数 直接执行python文件一样

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

publicclass Demo1 {
publicstaticvoid main(String[] args) {
        Process proc;
        // 编译器是python
        String exe = "cmd.exe";
        // py文件存的绝对路径
        String path = "D:\\NLP.py";
        // 传入的参数
        String args = "今天过的很开心";

		try {
            proc = Runtime.getRuntime().exec(exe + " \c start " + path + ' ' + args);// 执⾏py⽂件

            proc.waitFor();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3.2 优化

考虑到python是否正在进行,或者是否调用python,可设置一些函数用于辅助:

这里没有使用参数,直接对文件进行读取,传参可能会存在编码问题,Java默认UTF-8,cmd是GBK

package com.Lee.utils;
import java.io.*;
public class NLPUtils {
    // NLP处理
    public static String NLP(String data) throws Exception{
        try {
            inputToFile(data);
        }
        catch (Exception e){
            e.printStackTrace();
        }

        System.out.println("调用python程序");
        Process pcs = null;
        String py = "python.exe";
        try {
            if(processIsRun(py))
                killProcess(py);
            System.out.println("start");
            pcs = Runtime.getRuntime().exec("cmd.exe /c start F://python_project//NLP.bat");
            pcs.waitFor();
            if(processIsRun(py)){
                System.out.println("正在执行");
                Thread.currentThread().sleep(30000);
            }
            System.out.println("end");
        }
        catch (Exception e){
            e.printStackTrace();
        }
        String result = "";
        try {
            System.out.println("out:" + outputFromFile());
            result = outputFromFile();
        }
        catch (Exception e){
            e.printStackTrace();
        }
        return result;
    }
    // 清空文件
    public static void clearInfoForFile(String fileName) {
        File file =new File(fileName);
        try {
            if(!file.exists()) {
                file.createNewFile();
            }
            FileWriter fileWriter =new FileWriter(file);
            fileWriter.write("");
            fileWriter.flush();
            fileWriter.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    // 输入文件,参数为输出字符串
    public static void inputToFile(String input) throws Exception{
        // 写入前清空
        clearInfoForFile("F:\\python_project\\input.txt");
        //创建写入流
        FileWriter writer=new FileWriter("F:\\python_project\\input.txt");
        // 写入
        writer.write(input + "\r\n");
        //关闭资源
        writer.flush();
        writer.close();
    }
    // 读取文件
    public static String outputFromFile() throws Exception{
        InputStreamReader isr = new InputStreamReader(new FileInputStream("F:\\python_project\\output.txt"), "GBK");
        BufferedReader read = new BufferedReader(isr);
        String s = null;
        String result = "";
        while((s = read.readLine()) != null)
            result += s;
        isr.close();
        read.close();
        return result;
    }
    // 杀掉一个进程
    public static void killProcess(String name) {
        try {
            String[] cmd = {"tasklist"};
            Process proc = Runtime.getRuntime().exec(cmd);
            BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
            String string_Temp = in.readLine();
            while (string_Temp != null) {
                // System.out.println(string_Temp);
                if (string_Temp.indexOf(name) != -1) {
                    Runtime.getRuntime().exec("taskkill /F /IM " + name);
                    System.out.println("杀死进程  " + name);
                }
                string_Temp = in.readLine();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    // 判断进程是否存在
    public static boolean processIsRun(String ProjectName) {
        boolean flag = false;
        try {
            Process p = Runtime.getRuntime().exec("cmd /c tasklist ");
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            InputStream os = p.getInputStream();
            byte b[] = new byte[256];
            while (os.read(b) > 0)
                baos.write(b);
            String s = baos.toString();
            if (s.indexOf(ProjectName) >= 0) {
                flag = true;
            } else {
                flag = false;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return flag;
    }
}

总结

到此这篇关于如何在Java中调用python文件执行的文章就介绍到这了,更多相关Java调用python文件执行内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 极为简易的Qno SmartLink IPSec VPN设定

    VPN--Virtual Private Network,是针对在互联网技术及应用不断发展中,企业及特定用户对信息交流.传递.交换的安全性.可靠性及成本上的需求,在公共互联网的基础上,通过遂道和加密技术,构建虚拟专用网的解决方案. VPN构建中的一项重要的核心任务是遂道技术,而IPSec--因特网安全协议(即遂道协议)是VPN技术中较为成熟的遂道协议.相对于PPTP.SSL这两种协议来说, IPSec虽然公认是最值得信赖和安全的VPN协议,但同时也是出名的难以设置,安装配置和管理都比较复杂,尤其

  • java异步调用的4种实现方法

    目录 一.利用多线程 直接new线程 使用线程池 二.采用Spring的异步方法去执行(无返回值) @Async注解可以用在方法上,也可以用在类上,用在类上,对类里面所有方法起作用 三.采用Spring的异步方法+Future接收返回值 如果调用之后接收返回值,不对返回值进行操作则为异步操作,进行操作则转为同步操作,等待对返回值操作完之后,才会继续执行主进程下面的流程 四.原生Future方法 参考 一.利用多线程 直接new线程 Thread t = new Thread(){ @Overri

  • 利用Java代码写一个并行调用模板

    目录 前言: 1. 一个串行调用的例子 2. CompletionService实现并行调用 3. 抽取通用的并行调用方法 4. 代码思考以及设计模式应用 5. 思考总结 前言: 本文主要介绍内容有: 一个串行调用的例子(App首页信息查询) CompletionService实现并行调用 抽取通用的并行调用方法 代码思考以及设计模式应用 思考总结 1. 一个串行调用的例子 如果让你设计一个APP首页查询的接口,它需要查用户信息.需要查banner信息.需要查标签信息等等. 一般情况,小伙伴会实

  • 在Java中按值调用和按引用调用

    目录 一.为什么按值调用和按引用调用? 二.按值调用 三.引用调用 四.为什么Java中只有按值调用,没有按引用调用? 五.Java中的引用调用,但如何调用? 六.Java对象引用 七.结论 一.为什么按值调用和按引用调用? 方法或函数可以通过两种方式调用.一种是按值调用,另一种是按引用调用,这两种方式通常根据作为输入或参数传递给它们的值的类型来区分. 在我们开始之前,让我澄清一件事,在Java中,只有按值调用(值传递),没有按引用调用. 二.按值调用 按值调用是一种方法,通过复制给定变量(或常

  • 如何在Java中调用python文件执行详解

    目录 一.Java内置Jpython库(不推荐) 1.1 下载与使用 1.2 缺陷 二.使用Runtime.getRuntime()执行脚本⽂件 2.1 使用 2.2 缺陷 三.利用cmd调用python文件 3.1 使用 3.2 优化 总结 一.Java内置Jpython库(不推荐) 1.1 下载与使用 可以在官网下载jar包,官网:http://ftp.cuhk.edu.hk/pub/packages/apache.org/ 或者使用maven进行jar包下载 <dependency> &

  • 详解如何在Java中调用Python程序

    Java中调用Python程序 1.新建一个Maven工程,导入如下依赖 <dependency> <groupId>org.python</groupId> <artifactId>jython-standalone</artifactId> <version>2.7.0</version> </dependency> 2.在java中直接执行python代码片段 import org.python.util

  • Java中调用SQL Server存储过程详解

    本文作者介绍了通过Java如何去调用SQL Server的存储过程,详解了5种不同的存储.详细请看下文 1.使用不带参数的存储过程 使用 JDBC 驱动程序调用不带参数的存储过程时,必须使用 call SQL 转义序列.不带参数的 call 转义序列的语法如下所示: 复制代码 代码如下: {call procedure-name} 作为实例,在 SQL Server 2005 AdventureWorks 示例数据库中创建以下存储过程: 复制代码 代码如下: CREATE PROCEDURE G

  • 如何在Java中优雅地判空详解

    前言 整天都是在跟Java打交道.我在Java开发中最常用的一段代码就是用object != null在使用对象之前判断是否为空.这么做是为了避免NullPointerException.但是我发现这样检测代码实在是太丑了,而且及其不可读. 那有没有一种优雅的替代方法呢? 判空灾难 作为搬砖党的一族们,我们对判空一定再熟悉不过了,不要跟我说你很少进行判空,除非你喜欢NullPointerException. 不过NullPointerException对于很多猿们来说,也是Exception家族

  • 如何在C++中调用Python

    Python的安装 为了使用Python.h这个扩展项,我们需要安装一个python*-dev而不是python*,这两者略有区别,下面的案例展示的是在Ubuntu20.04下安装python3.9-dev的方法: dechin@ubuntu2004:~/projects/gitlab/dechin/$ sudo apt install python3.9-dev 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 下列软件包是自动安装的并且现在不需要了:

  • Java中的反射机制示例详解

    目录 反射 什么是Class类 获取Class实例的三种方式 通过反射创建类对象 通过反射获取类属性.方法.构造器 更改访问权限和实例赋值 运用场景 反射 反射就是把Java类中的各个成分映射成一个个的Java对象.即在运行状态中,对于任意一个类,都能够知道这个类的所以属性和方法:对于任意一个对象,都能调用它的任意一个方法和属性.这种动态获取信息及动态调用对象方法的功能叫Java的反射机制 每一个Java程序执行必须通过编译.加载.链接和初始化四个阶段 1.编译:将.java.文件编译成字节码.

  • Mybatis中Mapper映射文件使用详解

    紧接上文所述,在这篇文章中我将对Mapper映射文件进行详细的说明. Mapper映射文件是一个xml格式文件,必须遵循相应的dtd文件规范,如ibatis-3-mapper.dtd.我们先大体上看看支持哪些配置?如下所示,从Eclipse里截了个屏: 从上图可以看出,映射文件是以<mapper>作为根节点,在根节点中支持9个元素,分别为insert.update.delete.select(增删改查);cache.cache-ref.resultMap.parameterMap.sql. 下

  • 如何在IDEA中快速解决Jar冲突详解

    目录 一.为什么会产生Jar包冲突? 1.1 直接与传递依赖 1.2 Maven 的传递依赖 1.3 Maven 如何解决版本冲突? 1.4 覆盖传递依赖版本 1.5 使用直接依赖覆盖传递依赖版本 二.通过IDEA快捷解决依赖冲突 2.1 查找冲突 2.2 发现冲突 2.3 解决冲突 一.为什么会产生Jar包冲突? 作为 Java 开发人员,我们可能会使用 Maven 维护许多应用程序以进行依赖项管理.这些应用程序需要不时升级以保持最新状态并添加新功能或安全更新. 由于某些依赖项之间的冲突,这个

  • Java中JDBC的使用教程详解

    目录 概念 快速入门 步骤 代码实现 详解各个对象 DriverManager:驱动管理对象 Connection:数据库连接对象 Statement:执行sql的对象 ResultSet:结果集对象,封装查询结果 PreparedStatement:执行sql的对象 抽取JDBC工具类 : JDBCUtils 分析 代码实现 练习 JDBC控制事务 事务 操作 使用Connection对象来管理事务 代码 概念 Java DataBase Connectivity  Java 数据库连接, J

  • Java中Servlet的生命周期详解

    目录 Web基础和HTTP协议 什么是Servlet Servlet的生命周期 Web基础和HTTP协议 ┌─────────┐ ┌─────────┐ │░░░░░░░░░│ │O ░░░░░░░│ ├─────────┤ ├─────────┤ │░░░░░░░░░│ │ │ ├─────────┤ │ │ │░░░░░░░░░│ └─────────┘ └─────────┘ │ request 1 │ │─────────────────────>│ │ request 2 │ │───

随机推荐