2009-01-17 66 views
6

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


非常感谢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读回。我正在寻找更聪明的方法。无论如何感谢您的建议。

回答

4

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

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

3

如果你想从Java调用C函数,JNA(Java Native Access)可能是要走的路。 JNA允许您在本地库中调用函数,而无需编写C代码(与使用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

您可以使用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); 

希望帮助,

Mike(我写了Jep)