从Java内部处理Python IO

从Java内部处理Python IO,java,python,command-line,io,Java,Python,Command Line,Io,我目前正在从事一个Java项目,该项目将允许我对Python代码进行文本编辑、保存和执行。然而,我在执行这段代码时遇到了一个障碍 为了执行代码,我一直在做以下工作: Process p = Runtime.getRuntime().exec("python someFileName.py",null,new File("someFilePath"); 在这里,我有一个类,它接受这个进程,并尝试从进程中获取输入和输出流。我有一个计时器,它有一个动作监听器,每.01秒刷新一次 然而,这不是问题所在

我目前正在从事一个Java项目,该项目将允许我对Python代码进行文本编辑、保存和执行。然而,我在执行这段代码时遇到了一个障碍

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

Process p = Runtime.getRuntime().exec("python someFileName.py",null,new File("someFilePath");
在这里,我有一个类,它接受这个进程,并尝试从进程中获取输入和输出流。我有一个计时器,它有一个动作监听器,每.01秒刷新一次

然而,这不是问题所在。如果我的程序只包含python中的print语句,那么我可以很好地接收输入

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

我的操作方法如下:

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秒钟,然后出现大量文本

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

我希望我能在这个阻塞问题上得到一些帮助,这样我的文本就可以逐渐显示,而不必等待所有东西都被计时器或输入挡住


任何帮助或资源都将不胜感激。我目前的操作系统是Mac,但我希望任何解决方案也能在Windows上运行(如果可能的话)。

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

python -u someFileName.py

非常好用,谢谢!我不会想到的,因为我在运行控制台时通常不需要它。