java - 从 Java 内部处理 Python IO

标签 java python command-line io

我目前正在开发一个 Java 项目,该项目允许我编辑、保存然后执行 Python 代码。然而,我在执行这段代码时遇到了障碍。

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

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

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

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

如果我的程序包含任何需要阻止的内容(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!"

在 hibernate 期间不会显示任何内容。我假设我在 Java 程序中收到的内容是:

欢迎来到我的节目! 执行计算 ...然后五秒钟什么都没有...然后 在你的号码上加 5 6 7 8 9 10 完成!

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

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

我希望能就这个阻塞问题获得一些帮助,以便我的文本逐渐显示,而不是必须等待计时器或输入中的所有内容都消失。

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

最佳答案

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

python -u someFileName.py

关于java - 从 Java 内部处理 Python IO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12064904/

相关文章:

java - ImageMagick:如何将原始 PNG 与有损 JPEG 进行比较?

python - 使用在 HDI 中运行的 python 访问 blob 存储

java - .getResponse 代码在有效 URL 上抛出 IOException

Java - 简单的英语到 leet 转换器

python - Django 夹层 - 将 "blog page"的 url 设置为主页?如何?

python - Django Admin - 自定义内联表单

java - Spring Framework可以用于批处理应用吗?

powershell - 在命令行中使用完整路径和参数运行Powershell命令

java - 如何在Java程序中通过命令提示符运行.exe文件?

java - 在 Tomcat 中使用 JTA 1.2