我有一个用C- igraph (库的名称)编写的图形库的Python接口。我需要从Java代码中调用与这个图形库相关的python模块。它是这样的,库的核心在c中。这个核心已经被导入到Python中,并且在Python中可以使用到核心中嵌入的函数的接口。我的项目的其余代码是用Java编写的,因此我也想用Java调用图形函数。Jython -它允许你在Java中调用python模块。我继续尝试Jython,发现它在我的例子中不起作用,因为核心代码是用c编写的,并且Jython不支持在python代码中作为c dll导入的任何东西。我还考虑选择直接在c中调用图形例程的方法。也就是说,不通过Python代码。我假设一定有什么东西可以让你从Java调用c代码,不管我的C语言有多不好,所以我没有去尝试它。我最后的办法似乎是使用Java从命令行执行Python解释器。但那是一种肮脏和无耻。另外,为了处理Python代码产生的结果,我必须将结果写在一个文件中,然后用java读回它。又是下流的方式。有什么可以推荐给我的吗?感谢每一个付出时间的人。
感谢伊戈尔的回答。我看过了。乍一看,它似乎只是在调用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读回它。无论如何,我正在寻找一个更聪明的approach.Thanks来提供建议。
发布于 2010-03-25 08:54:15
如果你想从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正在缓慢但稳定地开发,它可能在几个月左右的时间内变得有用。
发布于 2012-08-29 05:37:22
您可以使用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)
https://stackoverflow.com/questions/454182
复制相似问题