Java中调用Python方法总结及踩坑记录

文章介绍了在Java中通过Runtime和Jython两种方式调用Python脚本的方法,包括无参数和有参数的情况,并详细记录了遇到的编码问题(Non-ASCIIcharacter)和ImportError问题,以及解决这些问题的策略,如设置编码声明和添加第三方库路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

最近在项目中需要通过Java调用Python脚本,在网上搜了很多博客,整个实操过程也踩了不少坑,因此通过这篇文章对Java中调用Python以及碰到的问题做一个总结。

调用方式

通过Runtime进行调用

例子如下:

public class InvokeByRuntime {
	/**
	 * @param args
	 * @throws IOException 
	 * @throws InterruptedException 
	 */
	public static void main(String[] args) throws IOExceptionInterruptedException {
		String exe = "python";
		String command = "D:\\calculator_simple.py";
		String num1 = "1";
		String num2 = "2";
		String[] cmdArr = new String[] {exe, command, num1, num2};
		Process process = Runtime.getRuntime().exec(cmdArr);
		InputStream is = process.getInputStream();
		DataInputStream dis = new DataInputStream(is);
		String str = dis.readLine();
		process.waitFor();
		System.out.println(str);
	}
}

caculator_simple.py:

# coding=utf-8
from sys import argv

num1 = argv[1]
num2 = argv[2]
sum = int(num1) + int(num2)
print sum

输出:

3

这种方式与直接执行Python程序的效果是一样的,Python可以读取Java传递的参数,但缺点是不能在Python中通过return语句返回结果,只能将返回值写到标准输出流中,再用Java读取Python的输出值

通过Jython调用

在maven项目中引入依赖,这里用的是最新版

<dependency>
  <groupId>org.python</groupId>
  <artifactId>jython-standalone</artifactId>
  <version>2.7.2</version>
</dependency>
无参数无返回值

例子:

package com.poas.utils;
import org.python.util.PythonInterpreter;

public class PythonTest {
    public static void main(String[] args) {
        PythonInterpreter interpreter = new PythonInterpreter();
        //这里用的是相对路径,注意区分
        interpreter.execfile("core/src/main/java/com/poas/utils/plus.py");
      
      	interpreter.cleanup();
        interpreter.close();
    }
}

plus.py:

a = 1
b = 2
print(a + b)

输出

3
有参数有返回值

例子:

package com.poas.utils;

import org.python.core.PyFunction;
import org.python.core.PyInteger;
import org.python.core.PyObject;
import org.python.util.PythonInterpreter;

public class PythonTest {
    public static void main(String[] args) {
        PythonInterpreter interpreter = new PythonInterpreter();
        //我在这里使用相对路径,注意区分
        interpreter.execfile("core/src/main/java/com/poas/utils/plus.py");

        // 第一个参数为期望获得的函数(变量)的名字,第二个参数为期望返回的对象类型
        PyFunction pyFunction = interpreter.get("add", PyFunction.class);
        int a = 5, b = 10;
        //调用函数,如果函数需要参数,在Java中必须先将参数转化为对应的“Python类型”
        PyObject pyobj = pyFunction.__call__(new PyInteger(a), new PyInteger(b));
        System.out.println("the anwser is: " + pyobj);
      
      	interpreter.cleanup();
        interpreter.close();
    }
}

plus.py:

def add(a,b):
    return a+b

执行后得到结果15

踩坑记录

网上大部分博客就到以上部分了,但我在实操中还遇到了以下问题

报错: Non-ASCII character in file xxx, but no encoding declared

原因是python文件中有中文,识别不了,就算是注释也不行

在python文件第一行中添加以下内容,问题解决

# -*- coding: utf-8 -*-

报错:Cannot create PyString with non-byte value

最开始用的jython版本是2.7.0,在Java中传递字符串时报了这个错:Cannot create PyString with non-byte value;在网上查了说是版本问题,于是将版本更新为2.7.2,问题解决

报错:ImportError: No module named xxx

我在python文件中引用了第三方库,结果出现该错误

Java文件:

public class PythonTest {
    public static void main(String[] args) {
        PythonInterpreter interpreter = new PythonInterpreter();       
        interpreter.execfile("core/src/main/java/com/poas/utils/hello.py");        
        PyFunction pyFunction = interpreter.get("hello", PyFunction.class);        
        PyString str = Py.newString("hello world!");
        PyObject pyobj = pyFunction.__call__(str);
        System.out.println(pyobj);
      
      	interpreter.cleanup();
        interpreter.close();
    }
}

python文件:

import requests #此处这个包没有实际作用,只是为了复现报错
def hello(str) :
    print(str)
    return str

报错:

ImportError: No module named requests

首先检查是否安装了对应的第三方库,在python环境下成功后,说明已安装对应模块;在网上搜索后发现要配置python的系统路径,代码如下:

public class PythonTest {
    public static void main(String[] args) {
		// 配置python的系统路径
        System.setProperty("python.home", "/usr/bin/python2.7");

        PythonInterpreter interpreter = new PythonInterpreter();
        interpreter.execfile("core/src/main/java/com/poas/utils/hello.py");        
        PyFunction pyFunction = interpreter.get("hello", PyFunction.class);        
        PyString str = Py.newString("hello world!");
        PyObject pyobj = pyFunction.__call__(str);
        System.out.println(pyobj);
      
      	interpreter.cleanup();
        interpreter.close();
    }
}

配置完成后,依然报错

继续查资料,除了上述配置外,还要将被引用的第三方库的路径添加到系统环境变量中,代码如下:

public class PythonTest {
    public static void main(String[] args) {
        // 配置python的系统路径
        System.setProperty("python.home", "/usr/bin/python2.7");

        PythonInterpreter interpreter = new PythonInterpreter();
        // 添加第三方库的路径
        PySystemState sys = interpreter.getSystemState();
        sys.path.add("/Users/xxx/Library/Python/2.7/lib/python/site-packages");

        interpreter.execfile("core/src/main/java/com/poas/utils/hello.py");
        PyFunction pyFunction = interpreter.get("hello", PyFunction.class);
        PyString str = Py.newString("hello world!");
        PyObject pyobj = pyFunction.__call__(str);
        System.out.println(pyobj);
        interpreter.cleanup();
        interpreter.close();
    }
}

问题解决

参考文献:

在Java中调用Python
【Java】使用Java调用Python的四种方法

<think>好的,用户现在的问题是:“我用Java做Web开发,学习使用Python只想做……”。看起来用户可能想继续补充,但可能输入时被截断了。根据之前的对话历史,用户之前询问了PyCharm社区版和专业版的区别,现在可能是在继续询问关于学习Python的方向或工具选择的问题。 首先,用户是Java Web开发者,现在想学习Python,但可能只打算用Python做某些特定的事情。由于之前的问题涉及PyCharm的两个版本区别,可能用户现在想知道作为Java开发者,如何选择PyCharm的版本,或者如何高效学习Python进行特定任务,比如Web开发或者数据分析。 接下来,我需要结合用户之前的提问来分析。之前的回复详细比较了社区版和专业版的功能,特别是专业版对Web开发、数据库和科学工具的支持。用户作为Java Web开发者,可能对Python的Web框架(如Django、Flask)感兴趣,或者想用Python进行自动化脚本、数据处理等。 可能的用户需求是:作为已有Java Web经验的开发者,学习Python时应该选择哪些工具(如PyCharm的哪个版本),以及如何高效利用现有经验迁移到Python开发,尤其是Web开发方面。用户可能还想知道专业版是否值得购买,或者社区版是否足够满足他的需求。 用户可能没有明确说明的部分是:他学习Python的具体目标是什么?是想用Python做Web开发补充现有的Java项目,还是转向Python Web开发,或者用于其他用途如数据分析、机器学习?不过根据他的背景是Java Web开发,可能更倾向于Web开发方向。 另外,用户可能在寻找如何利用PyCharm的专业版功能来提升Python Web开发效率,或者是否有必要购买专业版,或者是否有其他替代工具。此外,用户可能希望了解JavaPython在Web开发中的异同,以及如何快速上手。 需要确保回答覆盖以下点: 1. 作为Java Web开发者,学习Python的目标可能是什么? 2. PyCharm社区版是否足够,还是需要专业版? 3. 专业版在Web开发中的具体优势,如框架支持、数据库工具等。 4. 学习路径建议,如何利用现有Java经验。 5. 是否需要专业版的其他功能,如远程开发、科学工具等,根据用户需求。 6. 价格因素和替代方案。 需要避免假设用户的具体用途,但根据他的Java背景和之前的提问,推测他可能关注Web开发方面的比较和工具选择。因此,回答应侧重于Web开发相关的PyCharm版本选择,以及学习Python Web开发的建议,同时对比JavaPython的生态差异,帮助用户顺利过渡。</think>如果你主要用 **Java 做 Web 开发**,而学习 **Python 的目标是辅助开发或扩展技能**(例如脚本工具、自动化、数据分析等),以下是针对你的需求的工具选择和学习建议: --- ### 🔍 **核心需求匹配:PyCharm 版本如何选?** 你提到已有 Java Web 开发经验,**如果学习 Python 的目标是**: - ✅ **辅助现有 Java 项目**(如写脚本工具、自动化测试、数据处理) - ✅ **尝试 Python 的轻量级 Web 开发**(如小工具、微服务) - ✅ **探索数据科学/机器学习**(如用 Python 分析业务数据) #### **推荐选择:** 1. **社区版(Community Edition)**: - **适用场景**: - 学习 Python 基础语法、写简单脚本 - 开发命令行工具(如日志分析、文件批处理) - 轻量级自动化任务(如爬虫、测试脚本) - **优势**: - 免费,功能足够基础开发 - 支持基础调试、Git 集成,界面与 IntelliJ IDEA 类似(Java 开发者无缝切换) 2. **专业版(Professional Edition)**: - **适用场景**: - 需要 **Python Web 开发**(如用 Django/Flask 构建完整后端服务) - 需要 **数据库直接操作**(类似 Java 的 DataGrip,替代手动写 JDBC) - 需要 **与 Java 项目协作**(例如混合开发时调试 Python 微服务) --- ### 🛠 **从 Java 迁移到 Python 的高效学习路径** #### 1. **工具适配:** - **PyCharm 专业版**: - 优势:支持 **Java 开发者熟悉的 Web 框架模式**(如 Django 的 MVC 类似 Spring,Flask 类似 Javalin/Spark) - 示例:创建 Django 项目时,IDE 会自动生成路由、视图模板,类似 Spring Boot 的代码生成: ```python # 专业版生成的 Django 视图(类似 Java 的 @RestController) from django.http import JsonResponse def api_endpoint(request): return JsonResponse({"status": "ok"}) ``` - 通过插件(Python、Django、Jupyter)模拟部分专业版功能,但调试和框架支持较弱。 #### 2. **技能迁移:** - **Web 开发对比**: | **Java 概念** | **Python 对应方案** | 学习建议 | |------------------------|-------------------------|-----------------------------| | Spring Boot | Django/Flask | 从 Flask 入门(更轻量,类似 Javalin) | | JPA/Hibernate | Django ORM/SQLAlchemy | 优先学 Django ORM(语法更简洁) | | Maven/Gradle | `pip` + `requirements.txt` | 5 分钟即可上手 | - **常用库推荐**: - Web 开发:`FastAPI`(类似 Java 的 Micronaut,适合 API 服务)、`Django REST Framework` - 工具类:`requests`(HTTP 客户端,类似 Java 的 OkHttp)、`pandas`(数据操作,类似 Java 的 Tablesaw) #### 3. **避免**: - **动态类型**:Python 无编译检查,需善用 PyCharm 的 **类型提示(Type Hinting)** 和 **Linter**(类似 Java 的 Checkstyle)。 - **性能敏感场景**:若需高性能计算,可结合 Java(通过 Jython 或子进程调用)。 --- ### 💡 **是否需要购买 PyCharm 专业版?** - **需要购买**: - 计划用 Python 开发完整 Web 服务(需框架支持、数据库工具) - 企业报销或高频使用(专业版的 **HTTP 客户端**、**远程调试** 能大幅提效) - **无需购买**: - 仅需写脚本或学习语法(社区版 + VSCode 足够) - 可申请 **免费教育许可证**(学生/教师)或 **开源项目许可证** -- ### 📌 **总结建议** 1. **短期目标**(写小工具/学习语法)→ **社区版 + VSCode** 2. **长期目标**(替代或补充 Java Web 开发)→ **专业版试用 → 按需订阅** 3. **混合开发**:用 Python 写中间件(如数据处理层),Java 写核心业务,通过 REST API 或消息队列(如 RabbitMQ)通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值