如何用Jython导入Pandas

时间:2016-03-25 04:16:22

标签: python pandas jython-2.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,我该如何解决这个问题?

2 个答案:

答案 0 :(得分:6)

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

密切关注JyNI project(&#34; Jython Native Interface&#34;)。 它使Jython能够使用本机CPython扩展,其确切目的是解决您遇到的问题。 但是,它仍处于大量开发阶段,尚未能够将Pandas或NumPy加载到Jython中,但这两个框架在优先级列表中都很高。

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

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

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

答案 1 :(得分:3)

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

Jython是一个在JVM上运行Python程序的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管道,共享内存,内存缓存,Redis等)。

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

这种方法需要额外的编码(由于将任务分成不同的进程),并且序列化请求/响应(这取决于应用程序及其尝试处理的数据)。

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