从Java内部处理Python IO
我目前正在从事一个Java项目,该项目将允许我对Python代码进行文本编辑、保存和执行。然而,我在执行这段代码时遇到了一个障碍 为了执行代码,我一直在做以下工作:从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秒刷新一次 然而,这不是问题所在
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
非常好用,谢谢!我不会想到的,因为我在运行控制台时通常不需要它。