1

我使用这一行从 java 应用程序执行 python 脚本:

Process process = Runtime.getRuntime().exec("python foo.py", null, directory);

该脚本运行一个与我的 java 应用程序和其他客户端通信的 TCP 服务器。

当我调试脚本时,我在这里和那里有一些控制台打印,一切都很好。从 Java 代码启动脚本后,经过一段固定时间后,我的 TCP 服务器没有响应。经过一段时间的调试和挫折,我从脚本中删除了我的打印,一切都按预期工作。

似乎为进程的标准输出和错误流分配了一些内存,如果您不使用它,则进程在尝试写入完整缓冲区时会卡住。

如何启动该过程以便我不必使用标准输出流?我想保留打印件以进行调试,但不想启动一个线程来读取我不需要的流。

4

3 回答 3

2

您必须使用子进程的输出,否则最终它将因为输出缓冲区已满而阻塞(也不要忘记 stderr)。如果您不想修改 Java 程序以使用它,也许您可​​以在脚本中添加一个标志以完全关闭调试,或者至少将其指向一个文件(可能是 /dev/null)。

于 2012-01-04T19:28:19.680 回答
1

Java 公开了 ProcessBuilder。这是你可以用来执行你想要的东西。这会执行 fork-exec,还可以让您处理输出和错误流。

您的进程挂起的事实不是因为 java.lang. 这是一个标准问题,您的进程被阻塞,因为流已满并且没有人使用它。

尝试将 ProcessBuilder 与读取流的线程一起使用。

于 2012-01-04T19:30:11.820 回答
0

我过去做了一些类似的事情,我将进程的退出重定向到与进程相关的特定文件日志。稍后您可以看到正在发生的事情。你可以维护你的 python 脚本的踪迹。

于 2012-01-04T19:46:10.827 回答