我是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,我该如何解决这个问题?
答案 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解释器。 JPY和JEP是提供此功能的项目。使用其中任何一个,您都应该能够互操作Java和Pandas(或任何其他特定于CPython的框架)。
答案 1 :(得分:3)
据我所知,pandas
是用cython编写的,是CPython的扩展。这意味着它意味着CPython实现Python语言(这是大多数人使用的主要实现)。
Jython是一个在JVM上运行Python程序的Python实现,用于提供与Java库的集成,或者用于Java程序的Python脚本等。
作为CPython扩展(如pandas)实现的Python模块不一定与所有Python实现兼容(CPython以外的着名实现是Jython,PyPy和IronPython)
如果你真的必须一起使用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进程。