从Java调用Python模块

我有一个用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读回。 我正在寻找一种更聪明的方法。无论如何,谢谢你的建议。

没试过。 但我最近偶然发现了一个名为Jepp的项目 ,你可能会感兴趣。

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

如果你想从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源,但是我从来没有尝试过,很可能结果仍然需要一些手动调整。

另请注意, igraph的Java接口正在缓慢但稳定地开发,并且可能在几个月左右的时间内变得有用。

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

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

例如:

==> Java

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

==> Python

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

==> Java

 System.out.println(value.scriptResult); 

希望有所帮助,

迈克(我写了Jep)