Java调用python项目(传参、不传参、服务器)

这篇具有很好参考价值的文章主要介绍了Java调用python项目(传参、不传参、服务器)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、无参数调用举例

  1. 创建一个python文件,写入如下代码:

import numpy as np

array = np.arange(16).reshape(4, 4)
print(array)

a = 10000
b = 20000
c = a + b

print("result from Python: ")
print(c)
java调用python方法,python,java,Powered by 金山文档
  1. 创建一个Java文件

编写入如下代码(代码的意思已经添加注释)

/**
 * @author 段
 * @date 2023/3/22 17:06
 */
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class CallPython_Demo1 {
  public static void main(String[] args) {
         /*Java 调用Python 方式一: 使用Runtime.getRuntime()执行python脚本  例子1:无参数的例子 */
        Process proc;
        try {
            // 执行py文件,注意:这里的命令都最好用绝对路径,到底用哪一个环境的下的Python,比如env下面的tf2的环境;具体执行哪个python文件,也是绝对路径
            proc = Runtime.getRuntime().exec("D:\\Anaconda3\\envs\\tf2\\python.exe " +
                    "D:\\pythonProject\\SA_Experiment3_JavaCallPython\\toBeCalled1.py");

             // 用输入输出流来截取结果
            BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));

             //输出结果到Java的控制台
             String line = null;
             while ((line = in.readLine()) != null) {
                 System.out.println(line);
                 }

             in.close();
             proc.waitFor();
             } catch (IOException e) {
             e.printStackTrace();
             } catch (InterruptedException e) {
             e.printStackTrace();
             }
         }
 }
java调用python方法,python,java,Powered by 金山文档

3、结果如下说明运行成功

java调用python方法,python,java,Powered by 金山文档

二、有参数时调用举例

1、创建Java文件并写入代码

/**
 * @author 段
 * @date 2023/3/22 17:35
 */
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class CallPython_Demo2 {
    public static void main(String[] args) {

      int a=123;
      int b=456;

      try {
          String[] arguments = new String[] {
                  "D:\\Anaconda3\\envs\\tf2\\python.exe",
                  "D:\\pythonProject\\SA_Experiment3_JavaCallPython\\toBeCalled2.py",
                  String.valueOf(a),
                  String.valueOf(b) };

            // 执行py文件,注意:这里的命令都最好用绝对路径,到底用哪一个环境的下的Python,比如env下面的tf2的环境;具体执行哪个python文件,也是绝对路径
          Process proc = Runtime.getRuntime().exec(arguments); // 执行py文件,
             // 用输入输出流来截取结果
          BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));

             //输出结果到Java的控制台
          String line = null;
          while ((line = in.readLine()) != null) {
                 System.out.println(line);
                 }

          in.close();
          proc.waitFor();
      } catch (IOException e) {
          e.printStackTrace();
      } catch (InterruptedException e) {
          e.printStackTrace();
      }
  }
 }

java调用python方法,python,java,Powered by 金山文档

2、创建python文件并写入代码

import sys


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


if __name__ == '__main__':
    print(sys.argv)
    # 1、sys.argv 是获取运行python文件的时候命令行参数,且以list形式存储参数
    # 2、sys.argv[0]表示代码本身文件路径
    # 所以,java调用时,执行该程序,该python程序本身为sys.argv[0], sys.argv[1]、sys.argv[2]

    prameters = []
    for i in range(1, len(sys.argv)):
        print(i)
        prameters.append(int(sys.argv[i]))

    result = add(prameters[0], prameters[1])
    print(result)
java调用python方法,python,java,Powered by 金山文档

运行结果如下说明调用成功!

java调用python方法,python,java,Powered by 金山文档

三、将Python脚本做成服务,供Java调用

1、安装Python程序依赖的package,pillow和image

java调用python方法,python,java,Powered by 金山文档
java调用python方法,python,java,Powered by 金山文档

2、创建Java文件写入如下代码

/**
 * @author 段
 * @date 2023/3/22 18:53
 */
import java.lang.System;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.net.InetAddress;
 import java.net.Socket;
 import java.io.OutputStream ;
 import java.io.PrintStream;
 import java.io.InputStream;


         public class CallPython_Demo3 {
 public static void main(String[] args) {
         //System.out .println("Hello world!");
         // TODO Auto-generated method stub

         Socket socket = null;

         try {
            InetAddress addr = InetAddress.getLocalHost(); //因为都是在本机进行模拟,故也是用的getLoalHost()方法

             String host = addr.getHostName();
             String ip=addr.getHostAddress().toString(); //获取本机ip
             //log.info("调用远程接口:host=>"+ip+",port=>"+12345);

            //初始化套接字,设置访问服务的主机和进程端口号,HOST是访问python进程所在的主机名称(即远程服务器),可以是IP地址或者域名,PORT是python进程绑定的端口号

            socket = new Socket(host, 12345);

             // 获取服务进程的输出流对象
             OutputStream os = socket.getOutputStream();
             PrintStream out = new PrintStream(os);

             // 发送内容
             out.print("C:/Users/86151/Desktop/新建文件夹/20201106_215337.jpg");
            out.print("over"); // 这仅仅是为了标识一个信息的结束,“over”可以是自己任意设置的标识。告诉服务进程,内容发送完毕,可以开始处理


             // 获取服务进程的输入流对象
             InputStream is = socket.getInputStream();
             BufferedReader br = new BufferedReader(new InputStreamReader(is, "utf-8"));
             String tmp = null;
             StringBuilder sb = new StringBuilder();
            // 读取内容
             while ((tmp = br.readLine()) != null)
                 sb.append(tmp).append('\n');
             System.out.print(sb.toString());
             // 解析结果
             //JSONArray res = JSON.parseArray(sb.toString());
             } catch (IOException e) {
             e.printStackTrace();

             } finally {
             try {
                 if (socket != null)
                     socket.close();
                 } catch (IOException e) { }
             System.out.print("远程接口调用结束.");
             }

         }
 }

java调用python方法,python,java,Powered by 金山文档

3、创建python文件写入如下代码

import socket
import sys
import threading

import PIL.ImageFilter
import numpy as np
from PIL import Image


# 自定义个线程类,继承Thread类。Thread对象控制线程有两种方法:(1)构造函数里传递进去一个可调用的对象;(2)子类重写run方法。本例采用第二种方法。

class ServerThreading(threading.Thread):

    # words = text2vec.load_lexicon()
    def __init__(self, clientsocket, recvsize=1024 * 1024, encoding="utf-8"):

        threading.Thread.__init__(self)
        self._socket = clientsocket
        self._recvsize = recvsize
        self._encoding = encoding
        pass

    # 重写Thread类的run()方法
    def run(self):
        print("开启线程.....")
        try:

            # 接受数据
            msg = ''
            while True:

                # 读取recvsize个字节
                rec = self._socket.recv(self._recvsize)  # 从套接字缓冲区接受指定大小字节的数据。

                # 解码
                msg += rec.decode(self._encoding)
                # 数据接收是否完毕,Python socket无法自己判断是否接收数据完毕,所以需要通过自定义协议标志数据接受完毕

                if msg.strip().endswith('over'):  # 这里的“over”是Java传递消息时会在结尾加上,这个自己任意定义。

                    print("删减标识符前%s" % msg)
                    msg = msg[:-4]  # 再把"over"四个字节去掉,之后才是真正的消息。
                    print("删减标识符后%s" % msg)
                    break

            # 比如,这里可以对传过来的数据做任何处理了
            # 比如1:打开图片
            sendmsg = Image.open(msg)  # 识别和打开一篇图片,采用lazy方式,只有处理时才真正打开。

            sendmsg.show()  # 真正打开图片
            # 比如2:
            # 对图片进行旋转,再保存到指定位置
            # sendmsg.rotate(90).show()

            # 比如3:
            # 对图片进行效果渲染,再保存到指定位置
            effect_niu = sendmsg.filter(PIL.ImageFilter.CONTOUR)
            effect_niu.show()
            effect_niu.save("data/niu_random_shift.jpg")  # 保存效果渲染之后的图片

            # a=sendmsg.copy()
            # .transform(size=sendmsg.size,method=Image.Transform.EXTENT).show()

            # 发送数据
            self._socket.send(("%s" % sendmsg).encode(self._encoding))  # send(): Send`data' to the server.

            pass
        except Exception as identifier:
            self._socket.send("500".encode(self._encoding))
            print(identifier)
            pass
        finally:
            self._socket.close()

        print("任务结束.....")

        pass

    def __del__(self):
        pass


def main():
    # 创建服务器套接字
    serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # socket.AF_INET时访问family种的一种,代表(TCP/IP – IPv4)。

    # 获取本地主机名称运行起来后,等待着连接:
    host = socket.gethostname()
    # 设置一个端口
    port = 12345
    # 将套接字与本地主机和端口绑定
    serversocket.bind((host, port))
    # 设置监听最大连接数
    serversocket.listen(5)
    # 获取本地服务器的连接信息
    myaddr = serversocket.getsockname()
    print("Python服务器地址:%s" % str(myaddr))  # 输出访问地址

    # 循环等待接收客户端信息
    while True:
        # 获取一个客户端连接
        clientsocket, addr = serversocket.accept()  # 进入监听状态,没有的话,就停止在这,直到监听到有访问请求。

        # serversocket.accept()方法 Wait for an incoming connection. Return a new socket representing the connection,

        # and the address of the client. For IP sockets, the address info is a pair(hostaddr, port).

        print("侦测到有访问请求,来源的clientsocket为:%s" % str(clientsocket))
        print("侦测到有访问请求,来源的address为:%s" % str(addr))

        try:
            t = ServerThreading(clientsocket=clientsocket)  # 为每一个请求开启一个处理线程
            t.start()  # 启动该线程的活动,每个线程最多在run()方法里调用一次。
            pass
        except Exception as identifier:
            print(identifier)
            pass
        pass

    serversocket.close()
    pass


if __name__ == '__main__':
    main()
java调用python方法,python,java,Powered by 金山文档

注:修改代码中的图片的位置

可以发现图片传输成功,并出现渲染结果

java调用python方法,python,java,Powered by 金山文档
java调用python方法,python,java,Powered by 金山文档

完毕文章来源地址https://www.toymoban.com/news/detail-757245.html

到了这里,关于Java调用python项目(传参、不传参、服务器)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java-----web项目部署到新服务器以及服务器的部署

    目录 一、服务器安装jdk1.8  二、安装mysql5.7 2.1下载mysql  2.2修改root账号密码 2.3设置远程登录 三、项目的部署 3.1导入数据库 3.2将项目打成jar包 3.3项目上传 服务器部署项目的方式,本次以打成jar包的形式讲解(以springboot项目为例) 首先服务器要有jdk1.8和mysql5.6及以上的版本

    2024年02月06日
    浏览(50)
  • 服务器上进行java项目部署

    服务器上进行java项目部署,自己的一点总结, 一起学习,一起进步,一起成长! 【yzh2022.9】 服务器需要注意的是,【jdk、tomcat】我们不仅需要打开防火墙,同时如果是阿里云的服务器,安全组【docker..】也必须开放端口号才能进行访问 防火墙端口开了并且阿里云安全组也开

    2024年02月09日
    浏览(42)
  • JAVA项目在服务器部署过程

    推荐第一种 springboot项目中手动打包 打包依赖 他包含了 但建议还是自己写一个 build 标签 build详细配置参考文章https://www.cnblogs.com/whx7762/p/7911890.html 打包 jar包位置 用winSCP上传到服务器/data/tmp文件里 注意 :maven中仍需要向上面一样的配置 1.从git仓库clone下来最新代码。 2.在本地

    2024年02月05日
    浏览(44)
  • 【java】项目部署liunx服务器的简单步骤

    在Linux服务器上部署Java项目通常涉及到一系列步骤,下面是一个基本的部署流程,具体步骤可能会根据项目和服务器环境的不同而有所调整: 1. 准备工作: 1.1 安装Java环境: 在Linux服务器上安装Java运行环境,你可以选择OpenJDK或者Oracle JDK。使用包管理工具如 apt (Debian/Ubunt

    2024年02月03日
    浏览(79)
  • JAVA-服务器搭建-创建web后端项目

       

    2024年04月22日
    浏览(72)
  • 如何一键部署本地Java项目到服务器上

    我开发了一个Java代码,现在想部署到服务器上,当然可以使用Jenkins部署,但是Jenkins配置和维护成本比较高,所以我今天分享的是轻量级的一键部署脚本 演示:本地Window的Java代码 - Vmware虚拟机Centos7上 如果你的项目结构不同,可以根据项目结构自行调整 1、对项目进行Maven编

    2024年01月20日
    浏览(53)
  • java+vue 前后端项目部署 服务器部署流程 包括nginx软件安装,服务器选择,域名配置

    现在的web端项目大多数都是java+vue前后端分离的项目,都需要分开来部署,基本上都是部署在云服务器上的,这就涉及到选择和购买服务器,以及安装环境,本文记录的是在机器上安装软件,不在docker和宝塔上安装。下面请看详细的步骤吧,都是自己在工作中使用过的,本人

    2024年02月13日
    浏览(60)
  • SSM(Java)项目远程部署到服务器(保姆教程)

    项目部署主要是分为两种方式,一种是手动部署,另外一种是通过Shell脚本自动部署,SSM与javaweb项目不同的是,web项目需要依赖Tomcat项目运行,而SSM项目不需要,只要JDK即可。 如果未安装JDK,可以参考:https://blog.csdn.net/m0_63684495/article/details/128757218 个人博客:www.lcgui.cn 1.打包

    2024年02月10日
    浏览(47)
  • java静默打印PDF(可实现生产环境下服务器写入PDF模板,然后调用客户端打印机打印)

    需求 写这个的原因主要是因为当时项目中的打印功能是用户打印标签时,每次点击打印是通过把PDF文件下载到客户端浏览器,然后需要通过浏览器去点击打印机实现打印,就非常麻烦,每次都步骤非常复杂,而且每次参数都要重新设置。于是就想着怎么通过java实现自己调用

    2024年02月13日
    浏览(48)
  • Python项目部署到服务器(pycharm简易版)

    一、介绍 1.本文使用的一个Django项目进行演示,相关代码和数据可从git上拉取 项目代码git地址:https://gitee.com/XiaoYu333/OnlineStoreSalesDataScreen.git 2.使用pycharm将Python项目部署到服务器上并成功跑起来,需要满足以下条件: 项目本身没有问题,可以在Windows上成功跑起来 服务器上存

    2024年02月04日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包