Java ProcessBuilder无法在Java中运行Python脚本
Java ProcessBuilder无法在Java中运行Python脚本,java,python,processbuilder,Java,Python,Processbuilder,bfr.readLine()中的null 但是,如果我通过触发以下命令直接在终端上运行python文件,则没有问题: python C:/Machine\u Learning/Text\u Analysis/Ontology\u-based.py Python脚本的最后一行是打印(数据) 以下代码的结果是: 运行Python将启动: 第一行:空 拾取的JAVA选项:-Xmx512M 当脚本被终止/终止时,从stdin读取将返回null。执行一个过程#等待并查看exitValue是什么。如果它不
bfr.readLine()中的null
但是,如果我通过触发以下命令直接在终端上运行python文件,则没有问题:
python C:/Machine\u Learning/Text\u Analysis/Ontology\u-based.py
Python脚本的最后一行是打印(数据)
以下代码的结果是:
运行Python将启动:
第一行:空
拾取的JAVA选项:-Xmx512M
当脚本被终止/终止时,从stdin读取将返回null。执行一个过程#等待并查看
exitValue
是什么。如果它不是0,那么您的脚本很可能正在消亡
我会尝试使用一个只写一个值的愚蠢脚本。请确保打印python中的所有错误信息。通常在使用ProcessBuilder执行命令时,不考虑
PATH
变量。您的python C:/Machine\u Learning/Text\u Analysis/Ontology\u-based.py
直接在cmdshell中工作,因为它可以使用PATH
变量定位python
可执行文件。请在Java代码中提供python
命令的绝对路径。在下面的代码中,将
替换为python
命令及其库的路径。默认情况下,它通常类似于Windows中的C:\Python27\python
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(Arrays.asList("<Absolute Path to Python>/python", pythonPath));
Process p = pb.start();
BufferedReader bfr = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = "";
System.out.println("Running Python starts: " + line);
int exitCode = p.waitFor();
System.out.println("Exit Code : "+exitCode);
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);}
}
}
包文本聚类;
导入java.io.*;
公共类相似性{
/**
*
*@param args
*
*/
公共静态void main(字符串[]args){
试一试{
String pythonPath=“C:/Machine\u Learning/Text\u Analysis/Ontology\u-based.py”;
//字符串pythonExe=“C:/Users/AppData/Local/Continuum/Anaconda/python.exe”;
ProcessBuilder pb=新的ProcessBuilder(Arrays.asList(“/python”,pythonPath));
进程p=pb.start();
BufferedReader bfr=新的BufferedReader(新的InputStreamReader(p.getInputStream());
字符串行=”;
System.out.println(“运行Python开始:“+line”);
int exitCode=p.waitFor();
System.out.println(“退出代码:+exitCode”);
line=bfr.readLine();
System.out.println(“第一行:+行”);
而((line=bfr.readLine())!=null){
System.out.println(“Python输出:”+行);
}
}catch(异常e){System.out.println(e);}
}
}
我试过一个。该脚本运行一个带有Java参数的python文件。它还记录程序正在执行的行。希望这有帮助
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
public class Test {
public static void main(String... args) throws IOException {
ProcessBuilder pb =
new ProcessBuilder("python","samples/test/table_cv.py","1.pdf");
pb.redirectErrorStream(true);
Process proc = pb.start();
Reader reader = new InputStreamReader(proc.getInputStream());
BufferedReader bf = new BufferedReader(reader);
String s;
while ((s = bf.readLine()) != null) {
System.out.println(s);
}
}
}
您最好抓取错误流,并检查它输出的内容,因为您可能会遇到错误情况。或者,您也可以将错误流与输入流结合起来,然后读取这些内容。@hovercraftfullofels,谢谢!对不起,我是Java和Python的新手。。。那么,您的意思是在Java代码块中,我抛出异常而不是捕获异常吗?再次感谢!不需要。将catch块更改为
e.printStackTrace()
,以了解更多信息,但这是一个单独的问题。我的意思是,您应该像捕获InputStream一样捕获ErrorStream。但最简单的方法是调用pb.redirectErrorStream(true)
为了将错误流重定向到input stream.hmmm,我在try{}块中添加了pb.redirectErrorStream(true),在catch{}块中添加了e.printStackTrace()。。。但似乎没有什么机会?我错过什么了吗?请你举个例子好吗?非常感谢,我的建议只是看看是否发生了您没有看到的错误。只要您在创建ProcessBuilder对象后立即重定向错误流,您就是在遵循我的建议。那么,可能还有其他问题。如果不使用Java,如何运行python脚本?你需要给出python.exe的完整路径吗?对你的代码做一点解释也不错。这很有帮助。非常感谢。
try {
Process p = Runtime.getRuntime().exec(
"python D://input.py ");
BufferedReader in = new BufferedReader(new InputStreamReader(
p.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
in.close();
p.waitFor();
} catch (Exception e) {
}
try {
ProcessBuilder pb = new ProcessBuilder("C:/Python27/python", "D://searchTestJava//input.py");
Process p = pb.start();
BufferedReader bfr = new BufferedReader(new InputStreamReader(p.getInputStream()));
System.out.println(".........start process.........");
String line = "";
while ((line = bfr.readLine()) != null) {
System.out.println("Python Output: " + line);
}
System.out.println("........end process.......");
} catch (Exception e) {
System.out.println(e);
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
public class Test {
public static void main(String... args) throws IOException {
ProcessBuilder pb =
new ProcessBuilder("python","samples/test/table_cv.py","1.pdf");
pb.redirectErrorStream(true);
Process proc = pb.start();
Reader reader = new InputStreamReader(proc.getInputStream());
BufferedReader bf = new BufferedReader(reader);
String s;
while ((s = bf.readLine()) != null) {
System.out.println(s);
}
}
}