2

我目前正在开发一个 Java 项目,该项目允许我进行文本编辑、保存,然后执行 Python 代码。但是,我在执行此代码时遇到了障碍。

为了执行代码,我一直在执行以下操作:

Process p = Runtime.getRuntime().exec("python someFileName.py",null,new File("someFilePath");

从这里,我有一个接受这个过程的类,并尝试从这个过程中获取输入和输出流。我有一个带有动作监听器的计时器集,它将每 0.01 秒刷新一次。

然而,这不是问题。如果我的程序仅包含 python 中的打印语句,我可以很好地接收输入。

如果我的程序包含任何需要阻止的内容,无论是 raw_input 还是 time.sleep,都不会显示任何内容。

我的 actionPerformed 方法如下:

public void actionPerformed(ActionEvent e)
{
    try
    {
        while(inStream.available() > 0)
        {
            System.out.print((char)inStream.read());
        }
        while(errStream.available() > 0)
        {
            System.out.print((char)errStream.read());
        }
    }
    catch(Exception ex)
    {
        ex.printStackTrace();
    }
}

为了处理输出,我在 JTextArea 上有一个 KeyListener,它将将该区域的内容发送到输出流。

每当我的 Python 程序中有任何需要阻塞的东西时,无论在程序中的哪个位置,整个东西都会被锁定。

例如,我有这个 python 程序:

import time

print "Welcome to my Program!"
print "Performing calculations"
time.sleep(5)
num = 5
print "Adding 5 to your number"
for x in range(5):
    num+=1
    print num
print "Finished!"

在它休眠的时间内什么都不会显示。我会假设我在 Java 程序中收到的内容是:

欢迎来到我的节目!执行计算...然后五秒钟内什么都没有...然后将 5 添加到您的数字 6 7 8 9 10 完成!

但是直到 5 秒后才显示任何内容。所以我可以执行程序,等待 5 秒钟,然后出现大量文本。

或者对于使用 raw_input,同样的事情也会发生。所以换句话说,我不能用它来提示用户输入。

我希望我能在这个阻塞问题上得到一些帮助,这样我的文本就会逐渐显示,而不是不得不等待一切都通过计时器或输入来让路。

任何帮助或资源表示赞赏。我当前的操作系统是 Mac,但我希望任何解决方案也能在 Windows 上运行(如果可能的话)。

4

1 回答 1

3

默认情况下,python 脚本以缓冲输出运行。这意味着在脚本退出并刷新之前,您可能看不到任何标准输出。您所要做的就是使用 -u 启动 python 来请求无缓冲的输出。然后你会看到你所期待的。

python -u someFileName.py
于 2012-08-22T00:50:49.810 回答