大家在使用java调用python时,会碰到下面这个例子:

python代码,创建在D:\demo.py:

import numpy as np
a = np.arange(12).reshape(3,4)
print(a)

java代码:

你要修改的就是注释下面那行的两个参数

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

public class Demo {
    public static void main(String[] args) throws IOException, InterruptedException {
        try {
            System.out.println("start python");
            /*下面这行String里的数组很关键,它有两个参数,都推荐使用绝对路径,
            第一个参数是你python编译器所在的位置,直接写python,系统会使用默认的python,
            第二个参数是你python文件所在的位置。
            */
            String[] arg = new String[]{"D:\\abc\\Anaconda\\envs\\pytorch-py36\\python", "D:\\demo.py"};
            Process pr = Runtime.getRuntime().exec(arg);
            BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                System.out.println(line);
            }
            in.close();
            System.out.println("end");
            pr.waitFor();
            InputStream errorStream = pr.getErrorStream();
            BufferedReader error = new BufferedReader(new InputStreamReader(errorStream, "gbk"));

            String lines = null;
            while ((lines = error.readLine()) != null) {
                System.out.println(lines);
            }
            error.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

注意

如果你看过别人的文章,也许会遇到无输出的问题,改了第一个参数python的绝对路径也没用。

String[] arg = new String[]{“参数1”, “参数2”};
Process pr = Runtime.getRuntime().exec(arg);

我看了很多文章,总结出来:Runtime.getRuntime().exec()这个方法,相当于在cmd中运行python文件,具体运行方法可以去搜一下。

必须在cmd中,如果你能在参数1的python环境下,运行参数2的python文件,那么你就能在这个方法中成功调用;如果不行,在这个中也是不可以的。(我给出的代码运行后报错的话和你在cmd中去运行结果是一样的,方便大家纠错)

其实,原因就在于环境版本问题,也许你的电脑中存在多个python编译器,或者是anaconda中存在多个虚拟环境,你的python文件和你的python编译器没有对应上,在cmd中跑不起来,同样的在这个方法中也跑不起来。

像给出的例子,如果不包含第三方库,你把他改成简单的print(‘hello world‘)或者print(’你好‘),就跑起来了。因为numpy,它的版本和python版本不兼容,有匹配问题,报的错误中也会提及到这个问题。我找了很多文章,看到有人提版本问题的时候,我果断去换了之前配的虚拟环境,就跑起来了。


版权声明:本文为lm980521原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/lm980521/article/details/126677643