我有一个 python 应用程序,从我的角度来看,我无法编辑它的黑匣子。python 应用程序知道如何处理文本并返回处理后的文本。我有另一个用 Java 编写的应用程序,它知道如何收集未处理的文本。
当前状态,python 应用程序每 x 分钟以批处理模式运行。
我想做蟒蛇
处理过程的一部分:Java 应用程序收集文本并请求 python 应用程序处理并返回已处理的文本作为流的一部分。
您认为最简单的解决方案是什么?
谢谢, 罗德
我有一个 python 应用程序,从我的角度来看,我无法编辑它的黑匣子。python 应用程序知道如何处理文本并返回处理后的文本。我有另一个用 Java 编写的应用程序,它知道如何收集未处理的文本。
当前状态,python 应用程序每 x 分钟以批处理模式运行。
我想做蟒蛇
处理过程的一部分:Java 应用程序收集文本并请求 python 应用程序处理并返回已处理的文本作为流的一部分。
您认为最简单的解决方案是什么?
谢谢, 罗德
我对 Jython 之类的一无所知。我想这是最好的解决方案,如果您可以在每次 Java 应用程序需要转换文本时执行两个程序而无需执行新进程。无论如何,一个简单的概念证明是从 Java 应用程序执行一个单独的进程以使其工作。接下来,您可以使用所有这些工具来增强执行。
从 Java 执行单独的进程
String[] envprops = new String[] {"PROP1=VAL1", "PROP2=VAL2" };
Process pythonProc = Runtime.getRuntime().exec(
"the command to execute the python app",
envprops,
new File("/workingdirectory"));
// get an outputstream to write into the standard input of python
OutputStream toPython = pythonProc.getOutputStream();
// get an inputstream to read from the standard output of python
InputStream fromPython = pythonProc.getInputStream();
// send something
toPython.write(.....);
// receive something
fromPython.read(....);
重要提示:字符不是字节
很多人都低估了这一点。
注意字符到字节的转换(请记住 Writers/Readers 用于 chars,Input/OutputStreams 用于字节,编码是相互转换所必需的,您可以使用OuputStreamWriter
将字符串转换为字节并发送,InputStreamReader
将字节转换为字符并读取他们)。
查看Jython - 您可以直接从 Java 代码运行 Python 程序,并来回无缝交互。
Use ProcessBuilder to execute your Python code as a filter:
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class PBTest {
public static void main(String[] args) {
ProcessBuilder pb = new ProcessBuilder("python", "-c", "print 42");
pb.redirectErrorStream(true);
try {
Process p = pb.start();
String s;
BufferedReader stdout = new BufferedReader (
new InputStreamReader(p.getInputStream()));
while ((s = stdout.readLine()) != null) {
System.out.println(s);
}
System.out.println("Exit value: " + p.waitFor());
p.getInputStream().close();
p.getOutputStream().close();
p.getErrorStream().close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
将两者中的一个公开为某种服务,也许是 Web 服务。另一种选择是将 python 代码移植到 Jython
一个选项是使 python 应用程序作为服务器工作,通过套接字 (TCP) 侦听请求。
一种可能的解决方案是jpype。这允许您从 Python 启动 JVM 并在它们之间来回传递数据。
另一种解决方案可能是将 Python 程序编写为过滤器(从标准输入读取数据并将结果写入标准输出),然后将其作为管道运行。但是我不知道 Java 对此的支持情况如何——根据 Sun 文档,他们的管道概念仅支持同一 JVM 上的线程之间的通信。