【发布时间】:2014-10-03 01:00:25
【问题描述】:
null 来自bfr.readLine()
但是,如果我通过触发直接在终端上运行 python 文件是没有问题的:
python C:/Machine_Learning/Text_Analysis/Ontology_based.py
我的 Python 脚本的最后一行是 >> print(data)
下面代码的结果是:
运行 Python 开始:
第一行:空
拾取_JAVA_OPTIONS:-Xmx512M
package text_clustering;
import java.io.*;
public class Similarity {
/**
*
* @param args
*
*/
public static void main(String[] args){
try{
String pythonPath = "C:/Machine_Learning/Text_Analysis/Ontology_based.py";
//String pythonExe = "C:/Users/AppData/Local/Continuum/Anaconda/python.exe";
ProcessBuilder pb = new ProcessBuilder("python", pythonPath);
Process p = pb.start();
BufferedReader bfr = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = "";
System.out.println("Running Python starts: " + line);
line = bfr.readLine();
System.out.println("First Line: " + line);
while ((line = bfr.readLine()) != null){
System.out.println("Python Output: " + line);
}
}catch(Exception e){System.out.println(e);}
}
}
【问题讨论】:
-
您最好也抓住错误流并检查它输出的内容,因为您可能会遇到错误情况。或者,您可以将错误流与输入流结合起来,然后读取。
-
@HovercraftFullOfEels,谢谢!抱歉,我是 Java 和 Python 的新手......所以你的意思是在 Java 代码块中,而不是捕获异常,我抛出异常?再次感谢!
-
没有。将您的 catch 块更改为
e.printStackTrace()以获取更多信息,但这是一个单独的问题。我的意思是您应该像捕获 InputStream 一样捕获 ErrorStream。但最简单的方法是调用pb.redirectErrorStream(true);将错误流重定向到输入流。 -
hmmm,我在 try{} 块中添加了 pb.redirectErrorStream(true) 并在 catch{} 块中添加了 e.printStackTrace() ......但似乎没有机会?我错过了什么吗?你介意举个例子吗?非常感谢
-
我的建议只是查看是否发生了您没有看到的错误。只要您在创建 ProcessBuilder 对象后立即重定向错误流,就可以遵循我的建议。那么可能还有其他问题。如果你不使用 Java,你如何运行你的 python 脚本?是否需要给出 python.exe 的完整路径?
标签: java python processbuilder