Windows 下 Java 完美嵌入 Python 的“终极五步曲”

在 Windows 环境下使用 JEP(Java Embedded Python)时,很多旅人会被满屏的红字击退:要么 pip install jep 编译报错,要么 Java 启动时报 init_fs_encoding 崩溃、UnsatisfiedLinkError

网上的教程往往会让你在 Java 代码里疯狂修改 sys.path,或者配置一大堆复杂的 JVM 参数。但经历过无数次试错后,我发现剥去所有复杂的表象,真正的解决办法只有极其干净利落的五步

核心总结

  1. 使用 Visual Studio Installer 安装「Windows 10 SDK」和「使用 C++ 的桌面开发」。
  2. 创建一个干净的 Python 3.8 venv(虚拟环境)。
  3. 激活虚拟环境,通过 pip 安装 jep。
  4. 在 Maven 的 pom.xml 中引入 jep 依赖。
  5. 在操作系统中指定 PYTHONHOMEPYTHONPATH 环境变量。

第一步:准备 C++ 编译环境(防 pip install 报错)

JEP 在 Windows 下安装时需要编译 C 扩展。如果你直接 pip install,大概率会因为缺少编译器而光速白给。

  • 下载并打开 Visual Studio Installer
  • 勾选 「使用 C++ 的桌面开发」(Desktop development with C++)。
  • 在右侧的安装细节中,确保勾选了 「Windows 10 SDK」(这是为了提供 rc.exe 等核心构建工具)。
  • 安装完成后,重启电脑。

第二步:创建一个 Python 3.8 的 venv

为了不被系统中各种历史 Python 版本污染,我们需要给 JEP 准备一个独立的小天地。
在你的项目目录下,打开命令行执行:

# 使用你电脑上干净的 Python 3.8 创建虚拟环境
"C:\Program Files\python\python.exe" -m venv venv38

第三步:安装 Python 侧的 jep

有了第一步的编译器护航,现在你可以安心施放魔法了:

# 激活虚拟环境
venv38\Scripts\activate

# 更新 pip 并安装 jep
python -m pip install --upgrade pip
pip install jep

(注:如果后续你需要用到 requests、beautifulsoup4 等爬虫库,也一并在这里安装即可。)

第四步:安装 Java 侧的 jep (Maven 依赖)

Python 准备好了,Java 这边也得接应。在你的 Spring Boot/Java 项目的 pom.xml 中,加入与你通过 pip 安装的 jep 版本一致的依赖(例如 4.2.2):

<dependency>
    <groupId>black.ninia</groupId>
    <artifactId>jep</artifactId>
    <version>4.2.2</version> <!-- 请确保与 pip install jep 的版本一致 -->
</dependency>

第五步:在操作系统中指定环境变量

这是破除所有初始化崩溃(如 Fatal Python error)的终极解法。我们需要亲手为嵌入的 CPython 指路。

在启动你的 Java 程序(或执行 Maven 运行命令)之前,必须在系统中注入这两个环境变量:

  • PYTHONHOME:指向你的全局 Python 安装目录(让嵌入的 Python 能找到底层的标准库 encodings 等)。
  • PYTHONPATH:指向你的虚拟环境包目录(让 Python 醒来后能第一时间找到 jep 模块和你自己写的 Python 脚本)。

命令行配置示例(CMD):

set PYTHONHOME=C:\Program Files\python
set PYTHONPATH=D:\你的项目路径\SpiderModule\venv38\Lib\site-packages

IntelliJ IDEA 配置示例:
在 Run/Debug Configurations -> Environment variables 中填入:

PYTHONHOME=C:\Program Files\python;PYTHONPATH=D:\你的项目路径\SpiderModule\venv38\Lib\site-packages

见证奇迹的时刻

完成以上五步后,风的轨道就已经彻底理顺。你在 Java 里只需要极其简短的代码,就能唤醒 Python:

import jep.SharedInterpreter;
import jep.MainInterpreter;

public class JepConfig {
    public static void main(String[] args) {
        // 1. 强行指定 JEP 的 DLL 绝对路径,防止 Windows 下路径迷失
        // 路径通常在你的 venv 目录下的 Lib/site-packages/jep/ 里
        String jepDllPath = "D:/你的项目路径/SpiderModule/venv38/Lib/site-packages/jep/jep.dll";
        MainInterpreter.setJepLibraryPath(jepDllPath);

        // 2. 拥抱 Python!
        try (SharedInterpreter interp = new SharedInterpreter()) {
            interp.exec("import sys");
            interp.exec("message = 'Hello from Python! 版本: ' + sys.version");
            
            // 将 Python 的变量平滑地取回 Java
            String pythonMessage = interp.getValue("message", String.class);
            System.out.println("Java 收到了传书: " + pythonMessage);
            
            // 注意:Python 的数字在传回 Java 时,默认是 java.lang.Long 类型
            interp.exec("x = 1 + 2");
            int x = ((Number) interp.getValue("x")).intValue(); 
            System.out.println("Java 计算结果: " + x);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mryan2005

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值