Apple M1 Mac运行Python脚本提示已存在的libjli.dylib找不到OSError
报错原因
- 架构不兼容:你本地安装的JDK 1.8.0_301为x86_64架构版本,Apple M1芯片为arm64架构,未开启Rosetta 2兼容时,系统无法加载x86架构的dylib动态库,哪怕文件真实存在也会抛出找不到的报错。
- 环境变量冲突:你的PATH优先级最高的是Homebrew安装的arm64架构OpenJDK 17,但Python调用JVM的依赖库(如JPype)默认读取的是系统默认的JDK 8路径,两套JDK架构不匹配导致加载失败。
- 系统权限校验拦截:MacOS Big Sur对/Library目录下的动态库有签名和隔离属性校验,JDK 8的libjli.dylib可能因未通过签名校验被系统拦截,无法被Python进程加载。
排查步骤
- 校验动态库架构:执行命令
lipo -info /Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/jre/lib/jli/libjli.dylib,确认输出为x86_64还是arm64架构。 - 确认当前生效的JAVA_HOME:执行命令
/usr/libexec/java_home,检查输出路径是否和报错中的JDK 8路径一致,是否未指向适配arm64的Homebrew OpenJDK 17。 - 校验Python进程架构:执行命令
python3 -c "import platform; print(platform.machine())",确认Python运行的架构和要加载的JDK架构一致。
解决方法
方案1:修复架构不兼容问题
- 若必须使用JDK 8:下载适配arm64架构的JDK 8发行版替换原有x86版本JDK 8即可。
- 临时兼容方案:右键终端.app -> 显示简介 -> 勾选「使用Rosetta打开」,重启终端后再运行Python脚本,通过兼容层加载x86架构的JDK动态库。
方案2:修复环境变量冲突
- 统一JDK版本:在
~/.zshrc配置文件中添加export JAVA_HOME=$(/usr/libexec/java_home -v 17),执行source ~/.zshrc生效,让JVM依赖库优先使用适配arm64的OpenJDK 17。 - 显式指定JVM路径:如果使用JPype等库调用JVM,可在代码中直接指定正确的动态库路径,示例:
import jpype jpype.startJVM(jvmpath="/opt/homebrew/opt/openjdk/libexec/openjdk.jdk/Contents/Home/lib/jli/libjli.dylib")
方案3:修复系统权限拦截
执行命令sudo xattr -d com.apple.quarantine /Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk,移除JDK的隔离属性,绕过签名校验拦截。
内容的提问来源于stack exchange,提问作者Lew Goldstein
相关产品推荐
相关产品推荐

