使用Jython从Java调用含第三方模块的Python脚本遇ImportError问题
问题根源
你使用的jython-standalone 2.7.2是基于Python 2.7的Java实现解释器,和你系统中安装的Python3环境完全独立:
- 你通过系统
pip安装的pandas是针对Python3的,Jython根本无法识别 - 更关键的是,
pandas这类依赖CPython底层扩展的库,本身就不兼容Jython环境,即使强行安装也大概率无法正常运行
解决办法
优先推荐方案一,这是Java调用Python3第三方库最稳定的方式:
方案一:通过Java的ProcessBuilder调用系统Python3进程
直接调用你已经装好pandas的Python3环境执行脚本,完全绕开Jython的兼容性问题。
修改App.java代码
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class App { public static void main(String[] args) { try { // 启动系统Python3进程执行脚本(Windows下如果python3命令无效,换成python或完整路径如C:/Python39/python.exe) Process process = new ProcessBuilder("python", "./src/main/resources/hello.py").start(); // 读取脚本正常输出 BufferedReader outputReader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = outputReader.readLine()) != null) { System.out.println("脚本输出:" + line); } // 读取脚本错误输出(排查问题用) BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream())); while ((line = errorReader.readLine()) != null) { System.err.println("脚本错误:" + line); } process.waitFor(); } catch (IOException | InterruptedException e) { e.printStackTrace(); } } }
修改hello.py脚本
让脚本直接输出可被Java解析的格式(比如JSON):
import pandas as pd import json def get_data(): data = {'name': ['John', 'Emily'], 'age': [30, 40]} df = pd.DataFrame(data) return df if __name__ == "__main__": # 将DataFrame转为JSON格式输出,方便Java后续解析处理 print(json.dumps(get_data().to_dict(orient='records')))
调整pom.xml
直接移除jython的依赖,不需要再引入它。
方案二:强行尝试Jython安装pandas(不推荐)
如果非要用Jython,需要用Jython专属的包管理工具安装,且成功率极低:
- 下载Jython版本的
pip-jython脚本 - 执行命令:
jython pip-jython install pandas - 大概率会失败,因为
pandas依赖的numpy等库无法在Jython环境中编译运行
总结
Java调用带第三方库的Python脚本,最可靠的方式就是直接调用系统Python进程,Jython仅适用于无特殊依赖的Python2脚本场景。
内容的提问来源于stack exchange,提问作者LetsCode
相关产品推荐
相关产品推荐

