无法从Apache Commons Exec获取输出

时间:2017-10-25 16:07:15

标签: java apache-commons-exec

虽然标题非常相似,但这些问题Process output from apache-commons exec的副本。

我试图通过使用apache-commons exec来获取命令的输出。这就是我正在做的事情

import org.apache.commons.exec.*;
import java.io.ByteArrayOutputStream;

public class Sample {


    private static void runCommand(String cmd) throws Exception {
        ByteArrayOutputStream stdout = new ByteArrayOutputStream();
        PumpStreamHandler psh = new PumpStreamHandler(stdout);
        CommandLine cl = CommandLine.parse(cmd);
        DefaultExecutor exec = new DefaultExecutor();
        exec.setStreamHandler(psh);
        exec.execute(cl);
        System.out.println(stdout.toString());
    }

    public static void main(String... args) throws Exception {

        String cmd1 = "python -c \"print(10)\"";
        String cmd2 = "python -c \"import datetime; print(datetime.datetime.now())\"";

        runCommand(cmd1); // prints 10
        runCommand(cmd2); // should print the current datetime, but does not!
    }
}

问题是runCommand(cmd2)不会向输出打印任何内容。当我尝试在终端上运行命令时,它工作正常。

无论是否使用IDE,我都尝试过这个程序,所以我确定这与IDE控制台无关。

这是截图

enter image description here

这是终端

的屏幕截图

enter image description here

在终端上运行的Python命令

enter image description here

2 个答案:

答案 0 :(得分:1)

它在IDEA的矿山电脑上工作正常。尝试重新创建项目。添加有关您的环境的更多信息。 尝试将您的python代码放入.py文件并像“python test.py”一样运行。

screen

答案 1 :(得分:0)

一位同事能够找到解决这个问题的方法。改变

CommandLine cl = CommandLine.parse(cmd);

CommandLine cl = new CommandLine("/bin/sh");
cl.addArguments("-c");
cl.addArguments("'" + cmd + "'", false);

解决了这个问题。

完整的代码如下:

import org.apache.commons.exec.*;
import java.io.ByteArrayOutputStream;

public class Sample {
    private static void runCommand(String cmd) throws Exception {
        ByteArrayOutputStream stdout = new ByteArrayOutputStream();
        PumpStreamHandler psh = new PumpStreamHandler(stdout);

        // CommandLine cl = CommandLine.parse(cmd);
        CommandLine cl = new CommandLine("/bin/sh");
        cl.addArguments("-c");
        cl.addArguments("'" + cmd + "'", false);

        DefaultExecutor exec = new DefaultExecutor();
        exec.setStreamHandler(psh);
        exec.execute(cl);
        System.out.println(stdout.toString());
    }

    public static void main(String[] args) throws Exception {
        String cmd1 =  "python -c \"print(10)\"";
        String cmd2 =  "python -c \"import datetime; print(datetime.datetime.now())\"";

        runCommand(cmd1); // prints 10
        runCommand(cmd2);
    }
}