Java调用Python脚本

简介: Java调用Python脚本

1. 通过Runtime进行调用

  • 传参
/**
    * 通过Runtime调用Python脚本
    * @param args
    * @throws IOException 
    * @throws InterruptedException 
    */
   public static void main(String[] args) throws IOException, InterruptedException{
       String exe = "python3";
       String command = "D:\\calculator_simple.py";
       String[] cmdArr = new String[] {exe, command, "1", "2"};
       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);
   }
  • 返回结果
public static void main(String[] args) throws IOException, InterruptedException{
   String python = "python3.10"; 
   String script = "D:\\calculator_simple.py";
   String command = python + " " + script + " 1 2";
   Process process = Runtime.getRuntime().exec(command); 
   BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
   String line;
   String result = null;
   while ((line = in.readLine()) != null) {
       result = line;
       System.out.println("返回结果:" + result);
   }
   in.close();
   process.waitFor();
   System.out.println(result);
}
  • calculator_simple.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# from sys import argv
import sys
num1=sys.argv[1]
num2=sys.argv[2]
# 结果
sum = int(num1) + int(num2)
print(sum)

通过Runtime调用Python程序与直接执行Python程序的效果是一样的,可以在Python中读取传递的参数,也可以在Java中读取到Python的执行结果

2. 通过Jython调用

Jython是Python语言在Java平台的实现

<!--<dependency>
    <groupId>org.python</groupId>
    <artifactId>jython</artifactId>
    <version>2.7.0</version>
</dependency>-->
<dependency>
    <groupId>org.python</groupId>
    <artifactId>jython-standalone</artifactId>
    <version>2.7.2</version>
</dependency>
  • 执行python语句
@Test
void executePython() {
    // python语句,打印 Hello world !
    String py = "print('Hello world!')";
    PythonInterpreter interpreter = new PythonInterpreter();
    // 执行 Python 语句
    interpreter.exec(py);
}
// 在Java中执行Python语句,相当于在Java中嵌入了Python程序
// 意义不大
public static void main(String[] args) {
    System.setProperty("python.home", "D:\\jython2.7.0");
    PythonInterpreter interp = new PythonInterpreter();
    // 执行Python程序语句
    interp.exec("import sys");
    interp.set("a", new PyInteger(42));
    interp.exec("print a");
    interp.exec("x = 2+2");
    PyObject x = interp.get("x");
    System.out.println("x: " + x);
}
  • 执行python脚本
@Test
void executePythonFile() {
    // 定义脚本路径
    String path = "D:\\test.py";
    PythonInterpreter interpreter = new PythonInterpreter();
    // 执行脚本文件
    interpreter.execfile(path);
}
  • test.py
print('hello world by file')
  • 动态传参
@Test
void executePythonFunction() {
    PythonInterpreter interpreter = new PythonInterpreter();
    // 指定指定路径下的 python 脚本
    interpreter.execfile("D:\\test.py");
    // 指定需要调用的函数
    PyFunction function = interpreter.get("sendEmail", PyFunction.class);
    // ↓↓↓↓↓↓↓↓ 需要传入的参数 ↓↓↓↓↓↓↓↓
    // 邮件接受者
    PyString receiver = Py.newStringOrUnicode("xxx@qq.com");
    // 邮件主题
    PyString subject = Py.newStringOrUnicode("打个招呼【动态参数】");
    // 邮件内容
    PyString content = Py.newStringOrUnicode("我是Micky哈【动态参数】");
    // 调用
    PyObject pyObject = function.__call__(receiver, subject, content);
    // 打印返回结果
    System.out.println(String.format("result: %s", pyObject));
}
  • test.py 发送邮件
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import smtplib
from email.mime.text import MIMEText
# 邮件服务器地址
mail_host = 'smtp.qq.com'
# 邮件服务器用户名
mail_user = 'xxx@qq.com'
# 邮件服务器登录密码(有些是授权码)
mail_pwd = 'xxx'
# 邮件发送者
sender = 'xxx@qq.com'
def sendEmail(receiver, subject, content):
    """
    发送邮件
    :param receiver: 接收者
    :param subject: 邮件主题
    :param content: 邮件内容
    :return:
    """
    message = MIMEText(content, 'plain', 'utf-8')
    # 邮件主题
    message['Subject'] = subject
    # 发送方
    message['From'] = sender
    # 接收方
    message['To'] = receiver
    try:
        # 连接到服务器
        smtp = smtplib.SMTP_SSL(mail_host)
        # 登录服务器
        smtp.login(mail_user, mail_pwd)
        # 发送
        smtp.sendmail(sender, receiver, message.as_string())
        # 推出
        smtp.quit()
        return 'send email success ...'
    except smtplib.SMTPException as e:
        print('error', e)
if __name__ == '__main__':
    # 邮件接受者
    receiver = 'xxx@qq.com'
    # 邮件主题
    subject = '打个招呼'
    # 邮件内容
    content = '我是Micky哈'
    sendEmail(receiver, subject, content)


相关文章
|
9天前
|
人工智能 安全 Java
Java和Python在企业中的应用情况
Java和Python在企业中的应用情况
35 7
|
2月前
|
安全 网络安全 文件存储
思科设备巡检命令Python脚本大集合
【10月更文挑战第18天】
78 1
思科设备巡检命令Python脚本大集合
|
9天前
|
数据采集 监控 数据挖掘
Python自动化脚本:高效办公新助手###
本文将带你走进Python自动化脚本的奇妙世界,探索其在提升办公效率中的强大潜力。随着信息技术的飞速发展,重复性工作逐渐被自动化工具取代。Python作为一门简洁而强大的编程语言,凭借其丰富的库支持和易学易用的特点,成为编写自动化脚本的首选。无论是数据处理、文件管理还是网页爬虫,Python都能游刃有余地完成任务,极大地减轻了人工操作的负担。接下来,让我们一起领略Python自动化脚本的魅力,开启高效办公的新篇章。 ###
|
1月前
|
关系型数据库 MySQL 数据库连接
python脚本:连接数据库,检查直播流是否可用
【10月更文挑战第13天】本脚本使用 `mysql-connector-python` 连接MySQL数据库,检查 `live_streams` 表中每个直播流URL的可用性。通过 `requests` 库发送HTTP请求,输出每个URL的检查结果。需安装 `mysql-connector-python` 和 `requests` 库,并配置数据库连接参数。
126 68
|
10天前
|
机器学习/深度学习 人工智能 自然语言处理
比较Python和Java哪个更好
比较Python和Java哪个更好
32 5
|
7天前
|
监控 数据挖掘 数据安全/隐私保护
Python脚本:自动化下载视频的日志记录
Python脚本:自动化下载视频的日志记录
|
17天前
|
存储 Python
Python自动化脚本编写指南
【10月更文挑战第38天】本文旨在为初学者提供一条清晰的路径,通过Python实现日常任务的自动化。我们将从基础语法讲起,逐步引导读者理解如何将代码块组合成有效脚本,并探讨常见错误及调试技巧。文章不仅涉及理论知识,还包括实际案例分析,帮助读者快速入门并提升编程能力。
49 2
|
19天前
|
运维 监控 Python
自动化运维:使用Python脚本简化日常任务
【10月更文挑战第36天】在数字化时代,运维工作的效率和准确性成为企业竞争力的关键。本文将介绍如何通过编写Python脚本来自动化日常的运维任务,不仅提高工作效率,还能降低人为错误的风险。从基础的文件操作到进阶的网络管理,我们将一步步展示Python在自动化运维中的应用,并分享实用的代码示例,帮助读者快速掌握自动化运维的核心技能。
34 3
|
24天前
|
缓存 运维 NoSQL
python常见运维脚本_Python运维常用脚本
python常见运维脚本_Python运维常用脚本
27 3
|
24天前
|
数据采集 JSON 数据安全/隐私保护
Python常用脚本集锦
Python常用脚本集锦
20 2