如何用Jython导入Pandas

Jim*_*Chu 6 python pandas jython-2.7

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

Java的

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

蟒蛇

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()
Run Code Online (Sandbox Code Playgroud)

然后我收到了这个错误.

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
Run Code Online (Sandbox Code Playgroud)

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

ste*_*ori 7

您目前无法将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特定的框架).


far*_*zad 5

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

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

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

如果您确实必须将 Jython 和 Pandas 一起使用,并且找不到其他方法来解决问题,那么我建议在不同的过程中使用它们。

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

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

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

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

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