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

1 投票
1 回答
971 浏览
提问于 2025-04-17 20:40

我终于解决了这个问题!!现在,我把我的代码和笔记贴在这里,希望能帮助到其他人。

我的示例代码是用来计算两个单词之间的相似度分数。在Java中,它将两个单词发送到Python,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

1 个回答

0

这只是我的一种感觉,但我觉得你应该有:

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 相关的内容。如果之后你还是不知道该怎么办,欢迎再回来问。

撰写回答