问题:
之前在Ubuntu系统下使用java的getRuntime()方法执行python脚本可以正常运行,今天突然无法运行,也没有任何报错。
参考:
Java调用Python脚本无法得到运行结果
JAVA 调PYTHON 文件(使用ANACONDA的环境)
waitFor()的结果为1表示执行出错,结果为0表示执行成功。
System.out.println(proc.waitFor());
下面这段代码可以打印出错误流,这样就可以看到再执行python文件时是哪里出错了。
InputStream errorStream = proc.getErrorStream();
BufferedReader error = new BufferedReader(new InputStreamReader(errorStream,"gbk"));
String lineError = null;
while ((lineError = error.readLine()) != null){
System.out.println(lineError);
}
error.close();
查看错误流之后是因为第三方包cv2没导入成功,
查了很多博客都没解决问题,最后误打误撞发现竟然是要在python文件第一行添加#encoding:utf-8
-_-||,尴尬。。应该是windows系统与ubuntu系统对编码的要求不同
最后附上ubuntu系统可执行annconda虚拟环境下python文件的代码
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class CmdTest {
public static void main(String[] args) {
CmdTest cmdTest = new CmdTest();
ArrayList<String> cmdList = new ArrayList<>();
// cmdList.add("cd /home/dengjie/anaconda3/bin");
// cmdList.add("conda env list");
// cmdList.add("conda activate pytorch");
cmdList.add("/home/anaconda3/envs/pytorch/bin/python /home/Paper/detection/PyTorch-YOLOv3/detect.py");
// cmdList.add("ls");
List<String> list = cmdTest.executeCMD(cmdList);
}
public List<String> executeCMD(List<String> commands) {
List<String> res = new ArrayList<>();
Runtime run = Runtime.getRuntime();
try {
Process proc = run.exec("/bin/bash", null, null);
BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true);
for (String line : commands) {
out.println(line);
}
out.println("exit");
String rspline = "";
while ((rspline = in.readLine()) != null) {
System.out.println(rspline);
res.add(rspline);
}
//打印错误信息
InputStream errorStream = proc.getErrorStream();
BufferedReader error = new BufferedReader(new InputStreamReader(errorStream,"gbk"));
String lineError = null;
while ((lineError = error.readLine()) != null){
System.out.println(lineError);
}
error.close();
//waitFor()为0时表示执行成功,为1时执行失败
System.out.println(proc.waitFor());
in.close();
out.close();
proc.destroy();
} catch (InterruptedException | IOException e) {
e.printStackTrace();
}
return res;
}
}
列上参考博客:
Java调用Python程序方法总结(最全最详细)
JAVA 调PYTHON 文件(使用ANACONDA的环境)
java调用python的惨痛史(无法获取环境变量)
java调用python,引入第三方包报错no module named
java调用python程序
Java调用包含第三方库的Python脚本
java调用python过程中解决python第三方库问题
Java调用Python脚本无法得到运行结果
Java 调用 Python 没反应
ubuntu查看python及安装包的位置
JAVA使用Runtime.getRuntime()执行python脚本文件