7

我有一个用 C - igraph(库的名称)编写的图形库的 Python 接口。我的需要是从 Java 代码中调用与此图形库有关的 python 模块。就像这样,库的核心是在 c 中。该内核已导入 Python,并且内核中嵌入的函数的接口在 Python 中可用。我项目的其余代码是用 Java 编写的,因此我也想用 Java 调用图形函数。Jython - 允许您在 Java 中调用 python 模块是一个选项。我继续尝试 Jython 发现它在我的情况下不起作用,因为核心代码在 C 中,并且 Jython 不支持在 python 中作为 ac 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 读回。我正在寻找一种更聪明的方法。无论如何,感谢您的建议。

4

3 回答 3

4

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

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

于 2009-01-17T22:36:17.610 回答
4

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

另请注意,igraph 的 Java 接口正在缓慢而稳定地开发,它可能会在几个月左右变得有用。

于 2010-03-25T00:54:15.133 回答
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)

于 2012-08-28T21:37:21.970 回答