从Java调用Python模块

时间:2009-01-17 22:22:30

标签: java python ipc

我有一个用C - igraph(图书馆名称)编写的图形库的Python接口。我需要从Java代码调用与此图库有关的python模块。就像这样,图书馆的核心是c。这个核心已经导入到Python中,并且嵌入在核心中的函数的接口在Python中可用。我的项目的其余部分是用Java编写的,因此我也希望用Java调用图形函数。 Jython - 它允许你用Java调用python模块是一个选项。我继续尝试Jython发现它在我的情况下不起作用,因为核心代码在C中,Jython不支持在python中作为ac dll导入的任何东西code.I还想过选择直接在c中调用图例程的方法。那是没有通过Python代码。我假设必须有一些东西可以让你从Java调用c代码,我怎么也不擅长C因此我没有去做。 我的最后一招似乎是使用Java从命令行执行Python解释器。但这是一个肮脏无耻的人。另外,要处理Python代码生成的结果,我必须将结果写入文件并在java中读回。又脏了。 是否有任何人可以建议我的东西?感谢每个人给予时间。


感谢Igal回答。我看了一眼。乍一看,它似乎只是简单地调用python脚本。

Jep jep = new Jep(false, SCRIPT_PATH, cl);
jep.set("query", query);
jep.runScript(SCRIPT_PATH + file);
jep.close();

它与我们从命令行通过Java代码调用python解释器时的操作非常相似。

Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec("python test.py");

关注的是如何使用Python脚本生成的结果。天真的方法是将它们写入文件并用Java读回。我正在寻找一种更聪明的方法。无论如何,谢谢你的建议。

3 个答案:

答案 0 :(得分:4)

从未尝试过。但我最近stumbledproject named Jepp您可能感兴趣。

  

杰普在Java中嵌入了CPython。在严格的线程环境中使用是安全的,它非常快,其稳定性是主要特征和目标。

答案 1 :(得分:4)

如果要从Java调用C函数,JNA(Java Native Access)可能就是这样。 JNA允许您调用本机库中的函数,而无需编写C glue代码(就像使用JNI时一样),并自动映射Java和C中的原始数据类型。一个简单的示例可能如下所示:

import com.sun.jna.Native;
import com.sun.jna.Library;

public class PrintfWrapper {
    public interface CLibrary extends Library {
        CLibrary INSTANCE = (CLibrary)Native.loadLibrary("c", CLibrary.class);
        void printf(String formatString, Object... args);
    }

    public static void main(String[] args) {
        CLibrary.INSTANCE.printf("Hello, world\n");
    }
}

然而,igraph会使事情变得复杂,因为igraph使用许多无法直接映射到Java对应物的数据结构。有一个名为JNAerator的项目应该能够从igraph的头文件中生成JNA源,但我从未尝试过它,结果仍然需要一些手动调整。

另请注意,Java interface for igraph正在缓慢但稳定地发展,并且可能会在几个月左右的时间内发挥作用。

答案 2 :(得分:2)

您可以使用jep.getValue()从脚本的全局字典中检索值。

对于Python中的范围级别有一些警告,所以大多数人发现将Java类传递给python并在Python中设置该实例中的返回值更为明确。脚本完成后,Java代码将获得结果。

例如:

==>爪哇

class ReturnValueClass {
   public int scriptResult;
};
ReturnValueClass value = new ReturnValueClass();
jep.set("retval", value);

==>蟒

# do something
pass
# write the return value
retval.scriptResult = some_python_value

==>爪哇

System.out.println(value.scriptResult);

希望有所帮助,

迈克(我写了Jep)