Java 捕获python命令的输出

Java 捕获python命令的输出,java,python,Java,Python,我有以下python脚本 #!/usr/bin/env python import subprocess import sys from time import sleep p = subprocess.Popen(["ls", "-l", "."], stdout=subprocess.PIPE) output, err = p.communicate() print "*** Running ls -l command ***\n", output print "I'm gonna wai

我有以下python脚本

#!/usr/bin/env python
import subprocess
import sys
from time import sleep
p = subprocess.Popen(["ls", "-l", "."], stdout=subprocess.PIPE)
output, err = p.communicate()
print "*** Running ls -l command ***\n", output

print "I'm gonna wait 1 second"
sleep(1)

print "Waited..."

sleep(5)

print "Finished"
以及执行该脚本的以下Java程序:

protected List<String> runOutputLinesCommand(String scriptsPath) {
    List<String> ret = new ArrayList<String>();

    // constructs the python command to be executed
    String cmd = scriptsPath
            + COMMAND;
    ProcessBuilder pb = new ProcessBuilder(cmd);

    pb.redirectErrorStream(true);
    try {
        // executes the command and waits for its interruption
        Process p = pb.start();
        String s;
        // read from the process's combined stdout & stderr
        BufferedReader stdout = new BufferedReader(new InputStreamReader(
                p.getInputStream()));
        while ((s = stdout.readLine()) != null) {
            // appends the output of the command to the ret variable
            ret.add(s.trim());
        }
        p.waitFor();
        p.getInputStream().close();
        p.getOutputStream().close();
        p.getErrorStream().close();
    } catch (InterruptedException ex) {
        ret.add("script interrupted: " + ex);
    } catch (IOException ex) {
        ret.add("IOException: " + ex);
        ex.printStackTrace(System.out);
    } catch (Exception ex) {
        ret.add("Exception: " + ex);
        ex.printStackTrace(System.out);
    }

    return ret;
}
受保护列表runoutputlinescomand(字符串scriptsPath){
List ret=new ArrayList();
//构造要执行的python命令
字符串cmd=scriptsPath
+指挥部;
ProcessBuilder pb=新的ProcessBuilder(cmd);
pb.重定向错误流(真);
试一试{
//执行命令并等待其中断
进程p=pb.start();
字符串s;
//从流程的组合标准输出和标准输出中读取
BufferedReader标准输出=新的BufferedReader(新的InputStreamReader(
p、 getInputStream());
而((s=stdout.readLine())!=null){
//将命令的输出追加到ret变量
重新添加(s.修剪());
}
p、 waitFor();
p、 getInputStream().close();
p、 getOutputStream().close();
p、 getErrorStream().close();
}捕获(中断异常例外){
ret.add(“脚本中断:”+ex);
}捕获(IOEX异常){
ret.add(“IOException:+ex”);
例如printStackTrace(系统输出);
}捕获(例外情况除外){
补充(“例外情况:+ex”);
例如printStackTrace(系统输出);
}
返回ret;
}

我想要的是java程序实时打印正在执行的python行,而不是在执行所有脚本之前。我希望Java程序在python脚本输出时打印它。如何在java中实现这一点?

您需要打印Python程序的每一行输出,而不是(或者)将其附加到
ret

    while ((s = stdout.readLine()) != null) {
        //ret.add(s.trim());
        System.out.println(s);
    }

根据我的经验,为了确保Python脚本的输出没有缓冲,除了DNA建议的之外,还需要禁用输出缓冲。因此,请确保使用
-u
标志调用脚本到解释器;另外,
sys.stdout.flush()
可能是必需的

有关更多信息,请参阅或仅谷歌“python输出缓冲”或“python禁用输出缓冲”