Python 脚本在 Java 中执行后,没有显示任何错误信息,但是也没有执行成功。
代码示例:
public void addImg(){
try{
//Attempt 1
Runtime r = Runtime.getRuntime();
Process p = r.exec("/usr/bin/python2.7 ../wc.py");
p.waitFor();
p.destroy();
//Attempt 2
p = r.exec("python2.7 ../wc.py");
p.waitFor();
p.destroy();
}catch (Exception e){
String cause = e.getMessage();
System.out.print(cause);
}
}
2、解决方案
-
** 检查 exit 状态码:**
- 使用
Process.exitValue()
方法检查外部进程的退出状态码,0表示正常执行,非 0 表示出错。
- 使用
-
** 使用
ProcessBuilder
😗*- 使用
ProcessBuilder
类而不是直接使用Process
类来启动外部进程,ProcessBuilder
提供更多控制和配置选项。
- 使用
-
** 读取进程的输出和错误流:**
- 使用
Process.getInputStream()
和Process.getErrorStream()
方法读取外部进程的输出和错误流,这有助于识别潜在的错误。
- 使用
-
使用
StreamReader
类读取并打印进程输出:- 创建一个
StreamReader
类来处理进程的输出和错误流,可以帮助你更方便地查看脚本执行的情况。
- 创建一个
-
检查文件权限:
- 确保 Java 程序和 Python 脚本都具有适当的执行权限。
-
检查路径:
- 确保在
exec()
方法中指定的 Python 脚本的路径是正确的。
- 确保在
-
检查依赖包:
- 确保 Java 程序和 Python 脚本所需的依赖包都已安装和正确配置。
-
捕获异常:
- 在 Java 代码中捕获并处理来自
exec()
方法的异常,以便获得更多错误信息。
- 在 Java 代码中捕获并处理来自
代码示例:
public void addImg(){
try{
Runtime r = Runtime.getRuntime();
//Use absolute paths (e.g blahblah/foo/bar/wc.py)
p = r.exec("python2.7 ../wc.py");
//Set up two threads to read on the output of the external process.
Thread stdout = new Thread(new StreamReader(p.getInputStream()));
Thread stderr = new Thread(new StreamReader(p.getErrorStream()));
stdout.start();
stderr.start();
int exitval = p.waitFor();
p.destroy();
//Prints exit code to screen.
System.out.println("Process ended with exit code:" + exitval);
}catch(Exception e){
String cause = e.getMessage();
System.out.print(cause);
}
}
private class StreamReader implements Runnable{
private InputStream stream;
private boolean run;
public StreamReader(Inputstream i){
stream = i;
run = true;
}
public void run(){
BufferedReader reader;
try{
reader = new BufferedReader(new InputStreamReader(stream));
String line;
while(run && line != null){
System.out.println(line);
}
}catch(IOException ex){
//Handle if you want...
}finally{
try{
reader.close();
}catch(Exception e){}
}
}
}
结论:###
通过以上方法可以解决 Java 程序中执行 Python 脚本失败的问题。