使用加载Python C扩展DLL系统加载库

2024-05-29 04:29:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个扩展名为pydPython C Extension DLL,我想在windows上通过System.loadLibrary 在Java中加载。 似乎没有办法加载扩展名不同于*.dll的dll。在

有没有建议的方法来克服这个问题?在

用例

我计划在Java中嵌入Python。我创建了一个用JAVA加载的扩展dll,使用JNI与扩展dll通信,后者又与Python运行时环境交互以执行Python语句

_____                     _____          _____
| J | System.loadLibrary  |   |          | P |
| A |-------------------->| P |          | Y |
| V |                     | Y |<-------->| T |
| A |       JNI           | D |          | H |
|___|<------------------->|___|          | O |
                                         | N |
                                         |___|

Tags: 方法windowsextensionjava用例system建议计划
3条回答

好吧,如果您只想在Java中运行Python代码,那么Jython将允许您将Python源代码编译成Java .class字节码,但是您不能使用任何使用扩展模块的CPython功能。在

如果您真的需要在Java中嵌入CPython,那么“导入”一个.pyd文件对您没有帮助。只有在Python解释器已经初始化的情况下,.pyd才会正常工作。在

您需要做的是查看CPythonembedding docs,并按照这些文档中的示例使用JNI调用底层CPython函数。在

更新

听起来像是一个单独的.dll文件,它充当一个扩展模块,但也暴露了一些用于在Java中嵌入Python的符号。如果您从未计划在CPython中导入它,那么只需将其重命名为.dll。在

如果您确实需要在CPython中导入它,那么您可能应该将该功能分成两个独立的.dll文件——一个在JNI嵌入中使用,另一个只是充当扩展模块。在

Calling Python in Java?。基本上,您可以使用org.python.util.PythonInterpreter来调用Python或Jython。另一个可能的解决方案是使用UNIX样式的.so文件。另一个选择可能是使用get the current path,将其与.pyd文件名合并,然后使用系统负荷()按Markku K的规定

你试过用System.load()代替吗?您可以指定所需的任何文件名,但缺点是需要.pyd文件的完整路径。在


搜索将从中加载.dll的路径并不困难:

for (String s: System.getProperty("java.library.path").split(";")) {
    String pydName = s + "/mypythonlib.pyd";
    File pydFile = new File(pydName);
    if (pydFile.exists()) {
        System.load(pydName);
        break;
    }
}

相关问题 更多 >

    热门问题