Java调用python的程序

3种方式:

1、利用flask或者django的web向外提供接口调用(可参考django和flask的程序)

2、利用PyInstaller把python生成一个exe的可执行文件调用

3、比较麻烦,安装python,直接调用.py文件

第一种不介绍了,直接参考我的博客,flask和django框架搭建。

第二种方式:

 1、可以直接命令安装:pip install pyinstaller

也可以使用pychar安装pyinstaller插件。

 2、生成可执行文件:

pyinstaller -F -w hello.py

  hello.py是我的项目启动文件名称,生成的可执行文件放在同目录dist下

-F(注意大写)是所有库文件打包成一个可执行文件,windows下是exe,Linux下是对应的可执行文件;

-w是禁止弹出黑色控制台窗口。

项目调用了图片等本地资源,请将可执行文件放在对应目录才能运行。

 生成了可执行文件hello.exe

3、Java调用hello.exe文件(使用ProcessBuilder(参考我的博客))

程序演示:

package com.test.demo.gua;

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

/**
 * cmd /c dir 是执行完dir命令后关闭命令窗口。
 cmd /k dir 是执行完dir命令后不关闭命令窗口。
 cmd /c start dir 会打开一个新窗口后执行dir指令,原窗口会关闭。
 cmd /k start dir 会打开一个新窗口后执行dir指令,原窗口不会关闭。
 */
public class TestPython {
    public static void main(String[] args) {
        //.exe程序所在的完整路径
        String arguments = "H:\\WorkPlace\\JavaPlace\\demo\\demo\\file\\hello.exe";

       
        ProcessBuilder processBuilder = new ProcessBuilder(arguments);
        StringBuilder stringBuilder = new StringBuilder();
        processBuilder.redirectErrorStream(true);
        Process process =null;
        try {
            // 获取程序执行后返回的结果
            //执行这个.exe程序
            process = processBuilder.start();
//            process = Runtime.getRuntime().exec("cmd /c start " + arguments);
            BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream(),"GBK"));
            String line = null;
            while ((line = in.readLine()) != null) {
//                System.out.println(line);
                stringBuilder.append(line + System.lineSeparator());
            }
            in.close();
            //java代码中的process.waitFor()返回值为0表示我们执行.exe文件成功,
            //返回值为1表示执行.exe文件失败,这和我们通常意义上见到的0与1定义正好相反
            int re = process.waitFor();
            System.out.println(re);
            System.out.println(stringBuilder.toString().trim()+"-------------");
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            if (process != null) {
                process.destroy();
            }
        }
    }

}

成功输出:欢迎大家光临!!!

第三种就是安装python3,具体安装过程不展示

直接上代码:

// 依次为:python.exe的安装路径,hello.py脚本的存储路径
String[] arguments = new String[] {"D:\\Python\\python.exe", "H:\\WorkPlace\\JavaPlace\\demo\\demo\\file\\hello.py"};
		try {
		    // 运行hello.py
			Process process = Runtime.getRuntime().exec(arguments);
			BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream(),"GBK"));
			String line = null;
			while ((line = in.readLine()) != null) {
				System.out.println(line);
			}
			in.close();
			//java代码中的process.waitFor()返回值为0表示我们调用python脚本成功,
			//返回值为1表示调用python脚本失败,这和我们通常意义上见到的0与1定义正好相反
			int re = process.waitFor();
			System.out.println(re);
		} catch (Exception e) {
			e.printStackTrace();
		}

 这是用runtime的exec();也可以使用ProcessBuilder。

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
要在 Java调用 Python 程序,你可以使用 Java 的 `ProcessBuilder` 类,该类提供了启动进程并与其进行交互的功能。下面是一个简单的例子: ```java import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.BufferedReader; public class PythonCaller { public static void main(String[] args) { try { ProcessBuilder pb = new ProcessBuilder("python", "path/to/your/python/script.py"); Process process = pb.start(); // 获取 Python 程序的输出 InputStream inputStream = process.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String line; while ((line = bufferedReader.readLine()) != null) { System.out.println(line); } // 等待 Python 程序执行完毕 int exitCode = process.waitFor(); System.out.println("Python script exited with code " + exitCode); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } } ``` 在上面的例子中,我们启动了一个名为 `script.py` 的 Python 程序,并在 Java 中获取了其输出。如果需要向 Python 程序传递参数,可以在 `ProcessBuilder` 的构造函数中传递参数列表。例如,如果需要向 Python 程序传递一个字符串参数,可以这样写: ```java ProcessBuilder pb = new ProcessBuilder("python", "path/to/your/python/script.py", "arg1"); ``` 其中,`arg1` 就是要传递的参数。在 Python 程序中,可以通过 `sys.argv` 获取传递的参数。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值