我是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();
}
}
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与Jython一起使用,因为它依赖于CPython特定的本机扩展。一个依赖项是NumPy,另一个依赖项是Cython(它实际上不是本机CPython扩展,而是生成这样的扩展)。
注意JyNI project(“Jython本机接口”)。 它使Jython能够使用本机CPython扩展,其确切目的是解决您遇到的类似问题。 然而,它仍在大量开发中,还不能将Pandas或NumPy加载到Jython中,但这两个框架都是优先考虑的。
(例如,ctypes已经在某种程度上起作用了。)
另外,它目前仅限POSIX(在Linux和OSX上测试)。
如果您不特别需要Jython,而只需要一些Java/Pandas互操作,那么一个已经可行的解决方案就是嵌入CPython解释器。 JPY和JEP是提供此功能的项目。有了它们,您应该能够互操作Java和Pandas(或任何其他CPython特定的框架)。
据我所知,
pandas
是用cython编写的,是CPython扩展。这意味着它将被Python语言的CPython实现(这是大多数人使用的主要实现)使用。Jython是一个在JVM上运行Python程序的Python实现,用于提供与Java库的集成,或者Python脚本到Java程序等
作为CPython扩展实现的Python模块(如pandas)不一定与所有Python实现都兼容(除了CPython以外的著名实现是Jython、PyPy和IronPython)
如果你真的要把Jython和pandas一起使用,而你又找不到其他方法来解决这个问题,那么我建议在不同的过程中使用它们。
Java进程是在JVM上运行的Jython应用程序(要么是调用Jython库的Java代码,要么是可能需要与某些Java库集成的Python代码),另一个CPython进程运行以提供pandas所需的操作。
然后使用某种形式的IPC(或工具)进行通信(标准IO、套接字、OS管道、共享内存、memcache、Redis等)。
Java进程向CPython发送一个请求(或将请求注册到共享存储),提供处理参数,CPython进程使用pandas计算结果,并返回结果的序列化形式(或将结果放回共享存储)。
这种方法需要额外的编码(由于将任务分成不同的进程),并序列化请求/响应(这取决于应用程序和它要处理的数据)。
例如,在这个问题的示例代码中,Java process可以向CPython提供CSV文件名,CPython使用pandas处理CSV文件,生成结果CSV文件并将新文件的名称返回给Java process。
相关问题 更多 >
编程相关推荐