首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从Java调用Python模块

从Java调用Python模块
EN

Stack Overflow用户
提问于 2009-01-17 22:22:30
回答 2查看 5.3K关注 0票数 7

我有一个用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脚本。

代码语言:javascript
复制
Jep jep = new Jep(false, SCRIPT_PATH, cl);
jep.set("query", query);
jep.runScript(SCRIPT_PATH + file);
jep.close();

这不是非常类似于我们通过Java代码从命令行调用python解释器所做的事情吗?

代码语言:javascript
复制
Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec("python test.py");

我关心的是如何使用Python脚本生成的结果。天真的方法是将它们写到文件中,然后用Java读回它。无论如何,我正在寻找一个更聪明的approach.Thanks来提供建议。

EN

回答 2

Stack Overflow用户

发布于 2010-03-25 08:54:15

如果你想从Java中调用C函数,JNA (Java Native Access)可能是个不错的选择。JNA允许您调用本机库中的函数,而不必编写C粘合代码(使用JNI时必须编写),并自动在Java和C中的原始数据类型之间进行映射。一个简单的示例可能如下所示:

代码语言:javascript
复制
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正在缓慢但稳定地开发,它可能在几个月左右的时间内变得有用。

票数 4
EN

Stack Overflow用户

发布于 2012-08-29 05:37:22

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

关于Python中的作用域级别有一些警告,因此大多数人发现将Java类传递给Python并在python中设置该实例中的返回值会更清楚。脚本完成后,Java代码将得到结果。

例如:

==> Java

代码语言:javascript
复制
class ReturnValueClass {
   public int scriptResult;
};
ReturnValueClass value = new ReturnValueClass();
jep.set("retval", value);

==> Python

代码语言:javascript
复制
# do something
pass
# write the return value
retval.scriptResult = some_python_value

==> Java

代码语言:javascript
复制
System.out.println(value.scriptResult);

希望这能有所帮助,

Mike (我写了Jep)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/454182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档