7

我是 python 新手,我已经安装了 Jython2.7.0

爪哇

import org.python.util.PythonInterpreter;
import org.python.core.*; 

public class Main {
    public static void main(String[] args) {
         PythonInterpreter interp = new PythonInterpreter(); 
         interp.execfile("D:/Users/JY/Desktop/test/for_java_test.py");  
         interp.close();
    }
}

Python

import pandas as pd
import ctypes

def main():
    data = pd.read_csv('for_test.csv')
    data_mean = data.a*2
    data_mean.to_csv('catch_test.csv',index=False)
    ctypes.windll.user32.MessageBoxW(0, "Done. Output: a * 2", "Output csv", 0)

if __name__ == '__main__':
    main()

然后我得到了这个错误。

Exception in thread "main" Traceback (most recent call last):
File "D:\Users\JYJU\Desktop\test_java\for_java_test.py", line 1, in <module>
    import pandas as pd
ImportError: No module named pandas

如果我想使用 pandas,我该如何解决这个问题?

4

2 回答 2

9

您目前无法将 Pandas 与 Jython 一起使用,因为它依赖于 CPython 特定的本机扩展。一个依赖项是 NumPy,另一个是 Cython(它实际上不是原生 CPython 扩展,但会生成这样的扩展)。

密切关注JyNI 项目(“Jython Native Interface”)。它使 Jython 能够使用本机 CPython 扩展,其确切目的是解决您遇到的类似问题。然而,它仍在大力开发中,还不能将 Pandas 或 NumPy 加载到 Jython 中,但是这两个框架都处于优先级列表中。

(例如,ctypes 已经在某种程度上发挥了作用。)

此外,它目前仅支持 POSIX(在 Linux 和 OSX 上测试)。

如果您不需要专门的 Jython,而只是需要一些Java/Pandas 互操作,那么一个已经可行的解决方案是嵌入 CPython 解释器。 JPYJEP是提供此功能的项目。使用它们中的任何一个,您都应该能够互操作 Java 和 Pandas(或任何其他 CPython 特定框架)。

于 2016-05-27T01:52:01.597 回答
5

据我所知pandas,它是用cython编写的,是一个 CPython 扩展。这意味着它旨在供 Python 语言的CPython实现使用(这是大多数人使用的主要实现)。

Jython是一个 Python 实现,用于在 JVM 上运行 Python 程序,用于提供与 Java 库的集成,或为 Java 程序编写 Python 脚本等。

作为 CPython 扩展(如 pandas)实现的 Python 模块不一定与所有 Python 实现兼容(CPython 以外的著名实现是 Jython、PyPyIronPython

如果你真的必须同时使用 Jython 和 pandas 并且你找不到解决问题的其他方法,那么我建议在不同的进程中使用它们。

Java 进程是运行在 JVM 上的 Jython 应用程序(可以是调用 Jython 库的 Java 代码,或者是可能需要与某些 Java 库集成的 Python 代码),另一个 CPython 进程运行以提供 pandas 所需的操作。

然后使用某种形式的 IPC(或工具)进行通信(标准 IO、套接字、OS 管道、共享内存、memcache、Redis 等)。

Java 进程向 CPython 发送请求(或将请求注册到共享存储),提供处理参数,CPython 进程使用 pandas 计算结果并将结果的序列化形式发回(或将结果放回共享存储)。

这种方法需要额外的编码(由于将任务分成单独的进程),并序列化请求/响应(这取决于应用程序和它试图处理的数据)。

例如在这个问题的示例代码中,Java 进程可以将 CSV 文件名提供给 CPython,CPython 使用 pandas 处理 CSV 文件,生成结果 CSV 文件并将新文件的名称返回给 Java 进程。

于 2016-03-25T09:06:32.997 回答