在JAVA窗口中显示DOS(命令提示符)的输出

3
当我运行Python脚本时,输出会出现在DOS上(即在Windows中的命令提示符)。
我希望将输出显示在一个JAVA应用程序上,即在包含JTextArea的窗口上。输出应与DOS上的相同。
那么,如何捕获来自DOS的输出并将其插入到JAVA应用程序中?(我尝试将Python脚本的输出存储在文本文件中,然后使用JAVA读取它。但是,在这种情况下,JAVA应用程序会等待脚本先完成运行,然后再显示输出。而且,当输出超过屏幕大小时,会出现滚动条,以便我可以看到整个输出。)
在crowder的评论之后,我运行了这段代码。但输出总是:
错误: 进程说:
import java.io.*;
import java.lang.*;
import java.util.*;
class useGobbler {
        public static void main ( String args[] )
        {
        ProcessBuilder pb; 
        Process p;
        Reader r;
        StringBuilder sb;
        int ch;

        sb = new StringBuilder(2000);

        try
        {
            pb = new ProcessBuilder("python","printHello.py");
            p = pb.start();

            r = new InputStreamReader(p.getInputStream());
            while((ch =r.read() ) != -1)
            {
                sb.append((char)ch);
            }

        }
        catch(IOException e)
        {
            System.out.println("error");

        }

        System.out.println("Process said:" + sb);
    }
}

有谁能告诉我我做错了什么吗?

关于您的更新(实际上是完全不同的问题):异常的详细信息在哪里? 这很重要。 :-) 它将包含有用的信息,告诉您为什么会发生 IOException 异常。根据我的猜测,要么 python 不在您的路径中,要么 preintHello.py 不在当前目录中。 - T.J. Crowder
文件在同一个目录中。绝对地址为C:\Users\parth.k\Documents\printHello.py。就“Python”而言,当我在命令提示符中键入“python”时,它会出现错误,说“它不被识别为内部或外部命令……”你的意思是说,如果我打印异常的详细信息,我们就能找出确切的原因吗?如果是这样,我会打印并回复你。 - user1414696
@用户:是的,我的意思是,如果您输出异常的文本,它会告诉您出了什么问题。但在您的情况下,您已经知道:“……未被识别为内部或外部命令”所以python不在您的路径中,Java无法运行它。这个错误信息听起来像是Windows,因此这个页面应该会有帮助:http://docs.python.org/faq/windows.html#how-do-i-run-a-python-program-under-windows 这件事与Java或您最初的问题无关。 - T.J. Crowder
2个回答

3
您可以通过ProcessBuilder执行进程,这将给您一个Process实例,您可以通过从getInputStream返回的流读取输出。

以下是一个示例,运行Python脚本hello.py并在字符串中构建其输出:

import java.io.Reader;
import java.io.IOException;
import java.io.InputStreamReader;

public class RunPython {
    public static final void main(String[] args) {
        ProcessBuilder  pb;
        Process         p;
        Reader          r;
        StringBuilder   sb;
        int             ch;

        // Start the process, build up its output in a string
        sb = new StringBuilder(2000);
        try {
            // Create the process and start it
            pb = new ProcessBuilder("python", "hello.py");
            p = pb.start();

            // Get access to its output
            r = new InputStreamReader(p.getInputStream());

            // Read until we run out of output
            while ((ch = r.read()) != -1) {
                sb.append((char)ch);
            }
        }
        catch (IOException ex) {
            // Handle the I/O exception appropriately.
            // Here I just dump it out, which is not appropriate
            // for real apps.
            System.err.println("Exception: " + ex.getMessage());
            System.exit(-1);
        }

        // Do what you want with the string; in this case, I'll output
        // it to stdout
        System.out.println("Process said: " + sb);
    }
}

你可以随意处理这个字符串,包括像处理其他字符串一样将其放入JTextArea中。如果你愿意,你可以使用BufferedReader包装InputStreamReader,但是你已经了解了这个想法。


我看到“只是”成为OP最大的问题 :) 他需要一个SwingWorker/invokeLater,这通常会让新手感到困惑。 - Marko Topolnik
@user1414696:我已经更新了一个更好的例子来适应你的情况;文档中涉及重定向等内容的例子对你的目的来说信噪比较低。 :-) 如果你正在尝试进行中间更新等操作,请注意Marko所说的线程交互问题。 - T.J. Crowder
@MarkoTopolnik:不一定,这取决于进程运行的时间以及原帖发布者是否想要进行中期更新。 - T.J. Crowder
好的观点。如果只是一个运行几行输出的瞬间Python脚本,当它在运行时GUI可能会被阻塞。 - Marko Topolnik
这似乎更容易理解。再次感谢。 :) - user1414696

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接