【发布时间】:2020-05-10 22:49:20
【问题描述】:
是否可以使用 Java 从 Python 获取控制台输出?以下是此类输出的示例:
Python 3.3.4 (v3.3.4:7ff62415e426, Feb 10 2014, 18:13:51) [MSC v.1600 64 bit (AMD64)]
on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 2+2
4
>>>
现在,主要目标是通过使用 Java 调用 Python 解释器来获得上述输出。这是我的尝试:
//...
//Irrelevant code omitted
ProcessBuilder processBuilder = new ProcessBuilder("cmd");
processBuilder.redirectErrorStream(true);
processBuilder.start();
processBuilder.command("python2");
Process pythonProcess = processBuilder.start();
OutputStream outputStream = pythonProcess.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(outputStream);
osw.write("2+2\r\nquit()\r\n");
osw.flush();
osw.close();
InputStream inputStream = pythonProcess.getInputStream();
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(inputStream));
String line;
while( (line=bufferedReader.readLine())!=null) {
System.out.println(line);
}
//...
//Irrelevant code omitted
我知道调用start 方法会生成一个新进程及其执行环境。将python2 写入进程的输出流会导致创建另一个进程。这是问题开始的时候。我一直无法找到将命令2+2 发送到 Python 解释器(它是 CMD 的子进程)而不是其父进程的方法。
总结一下:如何运行 Python 解释器,在其中执行一些命令,最后将结果打印到标准输出?
【问题讨论】:
-
您的方法不容易实现,但多线程可能可行。我认为使用jython 可能会更容易。
-
@ElliottFrisch:你能用几句话解释为什么我的代码不能按预期工作吗?
-
您找不到将命令 2+2 发送到 Python 解释器的方法。不要运行
cmd,只需运行python2。添加线程。或者使用 jython。或者在此处添加更多详细信息,说明您为什么希望能够控制cmd来控制子进程。提示,我认为你不能。 -
@ElliottFrisch:我尝试直接运行
python2,但没有得到任何输出。很抱歉打扰你,但为什么我需要线程呢?非常感谢您的宝贵时间。 -
因为你想让它工作。相信你可以这样想,你正在运行的进程是在JVM外部的。因此,您需要一个线程来处理该进程的输出,并需要另一个线程来为该外部进程提供输入。