使用Runtime.exec向Python进程发送参数的解决方案

我终于解决了这个问题!! 现在,我在这里粘贴我的代码和注释,以帮助其他人。

我的示例代码是计算两个单词之间的相似度得分。 在Java中,它向Python发送两个单词,查找得分。 然后,Python得到两个参数并打印它们的相似性得分。 最后,它在Java中读取Python代码的结果。

Java的:

import java.io.*; public class RuntimeTest { public static void main(String[] args) { try { Runtime r = Runtime.getRuntime(); String[] cmd={"/usr/bin/python", "/home/parallels/Desktop/.../src/ConceptNetSimilarity.py", "cat", "dog"}; Process p = r.exec(cmd); #exec(String[] cmd) - cmd[0]:path of python-3.x cmd[1]:path of your python code cmd[2],[3]:arguments #if you only invoke python code without arguments, `Process p = r.exec("python path-of-your-code");` instead. p.waitFor(); BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); String line = ""; while ((line = br.readLine()) != null) { System.out.println(line); } p.waitFor(); } catch (Exception e) { e.printStackTrace(); } } } 

python:

 import sys import divisi2 assoc = divisi2.network.conceptnet_assoc('en') U, S, _ = assoc.svd(k=100) spread = divisi2.reconstruct_activation(U, S) print spread.entry_named(sys.argv[1],sys.argv[2]) #argv=['/home/parallels/Desktop/.../src/ConceptNetSimilarity.py', 'cat', 'dog'] 

结果:0.819618978389

这只是一种感觉,但我认为你应该有:

 print spread.entry_named(sys.argv[1],sys.argv[2]) 

代替

 print spread.entry_named(sys.argv[0],sys.argv[1]) 

argv [0]是python脚本。

另一方面,我不确定p.getInputStream()在这里的意思是什么。

一个好建议? 获取一个好的Java和Python参考 ,并至少阅读与您尝试在此处使用的API相关的内容。 在那之后,如果你仍然不知道该怎么做,那就回来吧。