0

尽管标题非常相似,但这个问题不是apache-commons exec 的 Process 输出的重复。

我正在尝试使用 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 控制台无关。

这是一个屏幕截图

在此处输入图像描述

这是终端的屏幕截图

在此处输入图像描述

在终端上运行的 Python 命令

在此处输入图像描述

4

2 回答 2

1

它在 IDEA 的我的 PC 上运行良好。尝试重新创建项目。添加有关您的环境的更多信息。尝试将您的 python 代码放入 .py 文件并像“python test.py”一样运行它。

屏幕

于 2017-10-25T16:17:13.503 回答
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);
    }
}
于 2017-10-26T05:55:01.980 回答