Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ProcessBuilder无法在Java中运行Python脚本_Java_Python_Processbuilder - Fatal编程技术网

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);
        }
    }
  }